在 MySQL 中使用 INSERT 查询
WITH queries with INSERT in MySQL
我正在尝试做一些我在 Postgresql 中几乎积极的工作:
WITH cte AS (SELECT something FROM something WHERE something.name='reference')
INSERT INTO somewhere (id, name)
SELECT cte.id, 'John'
UNION ALL
SELECT cte.id, 'Frank'
UNION ALL
SELECT cte.id, 'Thomas'
;
换句话说,我想获取“something”行以用于“somwhere”中的一堆新行。每个新条目都应该有一个引用(如外键值)回到 cte 中相同的“某物”行,主要是为了避免混乱。但是,MySQL 给了我“茫然凝视”语法错误机制。 MySQL 是否允许 WITH ... INSERT ...;
?
这是实际代码;它只是设置测试数据:
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'RESTAURANT'
;
您可以尝试使用子查询来执行 UNION ALL
因为 CTE
只能在第一个查询中使用。
WITH cte AS (SELECT something FROM something WHERE something.name='reference')
INSERT INTO somewhere (id, name)
SELECT id,name
FROM (
SELECT cte.id, 'John' name
UNION ALL
SELECT cte.id, 'Frank'
UNION ALL
SELECT cte.id, 'Thomas'
) t1;
所以您可以在查询中这样做
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id,utyp_id,num
FROM (
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000) num
FROM u WHERE utyp_name = 'RESTAURANT'
) t1
;
根据您的查询,我将重写为 IN
而不是 UNION ALL
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000) num
FROM u
WHERE utyp_name IN ('RESTAURANT','BEAUTY')
;
在 MySQL 中,INSERT
在 CTE
定义之前,即
INSERT INTO somewhere (id, name)
WITH cte AS (SELECT id FROM something WHERE something.name='reference')
SELECT cte.id, 'John' FROM cte
UNION ALL
SELECT cte.id, 'Frank' FROM cte
UNION ALL
SELECT cte.id, 'Thomas' FROM cte;
所以我认为以下方法可行:
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'RESTAURANT'
;
mySQL“INSERT WITH”的概念验证脚本
CREATE TABLE fromm field char(10));
INSERT INTO fromm VALUES ('Hello!');
CREATE TABLE too field char(10));
INSERT INTO too (field)
WITH pre AS
( SELECT field f FROM fromm)
SELECT f FROM pre;
SELECT field FROM too;
DROP TABLE fromm;
DROP TABLE too;
我正在尝试做一些我在 Postgresql 中几乎积极的工作:
WITH cte AS (SELECT something FROM something WHERE something.name='reference')
INSERT INTO somewhere (id, name)
SELECT cte.id, 'John'
UNION ALL
SELECT cte.id, 'Frank'
UNION ALL
SELECT cte.id, 'Thomas'
;
换句话说,我想获取“something”行以用于“somwhere”中的一堆新行。每个新条目都应该有一个引用(如外键值)回到 cte 中相同的“某物”行,主要是为了避免混乱。但是,MySQL 给了我“茫然凝视”语法错误机制。 MySQL 是否允许 WITH ... INSERT ...;
?
这是实际代码;它只是设置测试数据:
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'RESTAURANT'
;
您可以尝试使用子查询来执行 UNION ALL
因为 CTE
只能在第一个查询中使用。
WITH cte AS (SELECT something FROM something WHERE something.name='reference')
INSERT INTO somewhere (id, name)
SELECT id,name
FROM (
SELECT cte.id, 'John' name
UNION ALL
SELECT cte.id, 'Frank'
UNION ALL
SELECT cte.id, 'Thomas'
) t1;
所以您可以在查询中这样做
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id,utyp_id,num
FROM (
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000) num
FROM u WHERE utyp_name = 'RESTAURANT'
) t1
;
根据您的查询,我将重写为 IN
而不是 UNION ALL
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000) num
FROM u
WHERE utyp_name IN ('RESTAURANT','BEAUTY')
;
在 MySQL 中,INSERT
在 CTE
定义之前,即
INSERT INTO somewhere (id, name)
WITH cte AS (SELECT id FROM something WHERE something.name='reference')
SELECT cte.id, 'John' FROM cte
UNION ALL
SELECT cte.id, 'Frank' FROM cte
UNION ALL
SELECT cte.id, 'Thomas' FROM cte;
所以我认为以下方法可行:
INSERT INTO unit (pr_id, unt_number, utyp_id, unt_size)
WITH
pr AS (SELECT pr_id from property AS p WHERE p.pr_name = 'Royal Oaks Plaza'),
u AS (SELECT pr.pr_id AS pr_id, utyp.utyp_name AS utyp_name, utyp.utyp_id AS utyp_id FROM unit_type AS utyp, pr)
SELECT pr_id, '100', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'BEAUTY'
UNION ALL
SELECT pr_id, '110', utyp_id, FLOOR(500 + RAND() * 2000)
FROM u WHERE utyp_name = 'RESTAURANT'
;
mySQL“INSERT WITH”的概念验证脚本
CREATE TABLE fromm field char(10));
INSERT INTO fromm VALUES ('Hello!');
CREATE TABLE too field char(10));
INSERT INTO too (field)
WITH pre AS
( SELECT field f FROM fromm)
SELECT f FROM pre;
SELECT field FROM too;
DROP TABLE fromm;
DROP TABLE too;