当前位置: 首页 > 面试题库 >

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

闾丘晨
2023-03-14
问题内容

我想进行批量插入事务,但是我不太确定如何使用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”外键的语句的相应记录中。

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


问题答案:

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

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来获取值”。我需要更改标题以使其唯一。



 类似资料:
  • 问题内容: 我有本身具有外键的表。列 parentid 是外键, 不能 为NULL。 如果我这样做,那么它说不能将NULL插入 父母的父母 。但是,如果还没有插入行,我可以为它设置什么值呢? 我如何编写将向该表添加行的脚本? 谢谢 问题答案: 技巧:拥有一个带有虚拟密钥的虚拟行,例如99999。将其插入为FK,然后将FK更改为其实际值。并在交易中完成。

  • 问题内容: 我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样: 看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法? 这是我尝试过的: 我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代

  • 我有一张像下面这样的桌子。我试图根据CTE中的值合并到此表中。但当我试图在出现冲突时更新表时,它无法获得CTE中的值 现在使用cte,我想在这个表中插入/更新记录。下面是我用来做同样的事情的代码。当记录已经存在于表中时,我想根据cte(cte_input_data.data_type_id)中的data_type_id值更新表,但它失败并出错。 它应该实现的是 > 如果cte_输入_数据。数据类型

  • 我有一个表'new_table',序列id作为主键。如何使用其他表中的数据向其插入新记录。我试过: 但是得到了 重复的键值违反唯一约束详细信息:Key(id)=(...)已经存在。

  • 我在后文10中有如下陈述: 但是,由于我插入了多个值,除了这个值之外,我还有什么选择: