小编典典

如何在Postgres中使用CTE插入带有外键的多行?

sql

我想进行批量插入事务,但是我不太确定如何使用CTE或更有效的方法来执行此操作。这是我到目前为止的内容:

with bulky as (
    insert into products (title, description, price) 
                  values ('Dope product 1', 'Buy diz', 9.99), 
                         ('Dope product 2', 'Buy diz', 8.99), 
                         ('Dope product 2', 'Buy diz', 7.99) 
                  returning id
) 
insert into product_metadata (product_id, sales_volume, date) 
                       values (???, 80, '2017-03-21'), 
                              (???, 50, '2017-03-21'), 
                              (???, 70, '2017-03-21');

我的CTE的问题是我不知道如何从要插入的第一条插入语句中获取单个ID到第二条具有“ product_id”外键的语句的相应记录中。

我将如何构造该语句以使其起作用?我对其他解决方案持开放态度,这些解决方案提供了更有效的方法来实现相同的结果。


阅读 149

收藏
2021-03-23

共1个答案

小编典典

以下是您要做什么的合理解释:

with i as (
      insert into products (title, description, price)
          values ('Dope product 1', 'Buy diz', 9.99),
                 ('Dope product 2', 'Buy diz', 8.99),
                 ('Dope product 3', 'Buy diz', 7.99)
          returning *
     ) 
insert into product_metadata (product_id, sales_volume, date)
    select i.product_id, v.sales_volume, v.date
    from (values ('Dope product 1', 80, '2017-03-21'),
                 ('Dope product 2', 50, '2017-03-21'), 
                 ('Dope product 3', 70, '2017-03-21')
         ) v(title, sales_volume, date) join
         i
         on i.title = v.title;

基本答案是“使用returning *并使用ajoin来获取值”。我需要更改标题以使其唯一。

2021-03-23