【问题标题】:INSERT multiple rows combined with an ID from the RETURNING clauseINSERT 多行结合来自 RETURNING 子句的 ID
【发布时间】:2015-06-18 21:50:59
【问题描述】:
这是我的查询:
WITH rows AS (INSERT INTO t_patch(f_name)VALUES('KB000')RETURNING f_patch_id)
INSERT INTO t_patch_available (f_patch_id, f_product_id)
SELECT f_patch_id,7 FROM rows;
它有效。但是,如果我想插入多个具有相同f_patch_id 的t_patch_available,语法是什么?
【问题讨论】:
标签:
sql
postgresql
common-table-expression
sql-insert
sql-returning
【解决方案1】:
您可以在 select 上使用 union 来添加更多行。
WITH rows AS (INSERT INTO t_patch(f_name)VALUES('KB001')RETURNING f_patch_id)
INSERT INTO t_patch_available (f_patch_id, f_product_id)
SELECT f_patch_id,7 FROM rows
UNION ALL SELECT f_patch_id, 8 FROM rows
【解决方案2】:
您不想每行使用一个SELECT,这对于多行来说是不必要的冗长和昂贵的。 CROSS JOIN 到一组 ID(假设 product_id 是 integer)。
WITH rows AS (INSERT INTO t_patch(f_name) VALUES ('KB000') RETURNING f_patch_id)
INSERT INTO t_patch_available (f_patch_id, f_product_id)
SELECT f_patch_id, product_id
FROM rows
, unnest ('{6,8,9,11,345}'::int[]) product_id; -- set of product_id's
或者您可以使用VALUES 表达式:
...
FROM rows
, (VALUES (6) ,(8), (9), (11), (345)) AS p(product_id); -- set of product_id