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