我有一个表,比方说campaigns,我想在其中添加一个外键,引用刚刚创建的表中的一个记录:statistics。我想在NOT NULL上添加一个campaigns.statistic_id约束,因此我需要首先为每个statistics记录创建一个campaigns记录,更新campaigns以设置statistic_id(每个campaigns记录一个),然后添加约束。
我找不到一个干净的方法来生成Nstatistics记录,其中N等于count(*) from campaigns,在这之后,在INSERT表上做一个UPDATE来设置campaignsfk。
到目前为止,我得到的是以下内容(但不起作用,语法错误围绕statistic_id):

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);

但是insert的fed很差,并且每个statistics.id之间可以包含“间隙”,而不是通常的递增(参见SqlFiddle:http://www.sqlfiddle.com/#!17/c7580/2)。必须有更好的方法来实现这一点。
我正在使用PostResqlV9.6。外键必须在id表中(因为我们将有多个表引用此campaigns表,并且不希望有复合外键)。

最佳答案

如果我正确理解您的问题,这将满足您的要求:

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

关于sql - 使用表中插入返回的ID更新表的所有行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49695134/

10-11 06:32