使用TableB中的Insert返回的ID更新TableA的所有行

时间:2018-04-06 14:31:34

标签: sql postgresql

我有一个表,让我们说campaigns,我想在其中添加一个引用我刚创建的表中的记录的外键:statistics。我想在NOT NULL上添加campaigns.statistic_id约束,因此我需要先为每个statistics记录创建一个campaigns记录,更新campaigns以设置{ {1}}(每个statistic_id记录一个),然后添加约束。

我无法找到一种干净的方式来生成N campaigns条记录,其中N等于statistics,并且在此count(*) from campaigns之后执行INSERTUPDATE表格中设置campaigns fk。

到目前为止是以下内容(但无法正常工作statistic_id周围的语法错误):

insert

我们找到了解决方法,但我觉得必须有更好的方法来实现这一目标。基本上我们(工作)的解决方法是:

update campaigns
set statistic_id = tmp.id
from (
  insert into statistics default values -- basically 0 for all columns
  returning id
) tmp;

insert into statistics select id from campaigns; update campaigns set statistic_id = id; select setval('statistics_id_seq', (select max(id)+1 from statistics), false); 喂食不佳,可能包含"空白"在每个statistics.id之间而不是正常递增(参见SqlFiddle:http://www.sqlfiddle.com/#!17/c7580/2)。 必须有更好的方法来实现这一目标。

我正在使用PostreSQL v9.6。外键必须位于id表中(因为我们将有几个表引用此campaigns表,并且不想使用复合外键)。

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,这将做你想要的:

insert into statistics (id)
    select row_number() over (order by id)
    from campaigns;

update campaigns
    set statistic_id = c.s_id
    from (select c.*, row_number() over (order by id) as s_id
          from campaigns c
         ) c
    where campaigns.id = c.id;

SQL Fiddle