我有一个表,让我们说campaigns
,我想在其中添加一个引用我刚创建的表中的记录的外键:statistics
。我想在NOT NULL
上添加campaigns.statistic_id
约束,因此我需要先为每个statistics
记录创建一个campaigns
记录,更新campaigns
以设置{ {1}}(每个statistic_id
记录一个),然后添加约束。
我无法找到一种干净的方式来生成N campaigns
条记录,其中N等于statistics
,并且在此count(*) from campaigns
之后执行INSERT
在UPDATE
表格中设置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
表,并且不想使用复合外键)。
答案 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;