【问题标题】: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_idt_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
    

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 2014-05-11
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2022-01-06
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多