Sql 在插入新表时更新外键
我有表A(id) 我需要Sql 在插入新表时更新外键,sql,postgresql,Sql,Postgresql,我有表A(id) 我需要 创建表B(id) 向引用B.id的表a添加外键 对于A中的每一行,在B中插入一行,并使用B中新插入的行更新A.B_id 是否可以不在B中添加一个临时列来引用a?下面的内容确实有用,但我不想做一个临时专栏 alter table B add column ref_id integer references(A.id); insert into B (ref_id) select id from A; update A set b_id = B.id from B wh
- 创建表B(id)
- 向引用B.id的表a添加外键
- 对于A中的每一行,在B中插入一行,并使用B中新插入的行更新A.B_id
alter table B add column ref_id integer references(A.id);
insert into B (ref_id) select id from A;
update A set b_id = B.id from B where B.ref_id = A.id;
alter table B drop column ref_id;
假设:
1) 您正在使用postgresql 9.1
2) B.id是一个序列(因此实际上是一个int,默认值为nextval('B_id_seq'))
3) 当插入到B时,实际上是从A添加了其他字段,否则插入是无用的
…我认为这样做是可行的:
with n as (select nextval('b_id_seq') as newbid,a.id as a_id from a),
l as (insert into b(id) select newbid from n returning id as b_id)
update a set b_id=l.b_id from l,n where a.id=n.a_id and l.b_id=n.newbid;
ALTER TABLE A ADD b_id integer;
WITH cte AS (
SELECT
id
ROW_NUMBER() OVER (ORDER BY id) AS b_ref
FROM A
)
UPDATE A
SET b_id = cte.b_ref
FROM cte
WHERE A.id = cte.id;
CREATE TABLE B (
id integer CONSTRAINT PK_B PRIMARY KEY
);
INSERT INTO B (id)
SELECT b_id
FROM A;
外键
约束:
ALTER TABLE A
ADD CONSTRAINT FK_A_B FOREIGN KEY (b_id) REFERENCES B (id);
这个问题太令人困惑了吗?你的问题没有意义。您真正想要实现的是什么?这在本场景中是可行的,但我还有12个表需要将相应的行插入到中。在本例中,我有许多表需要具有“可注释”关联。我有一个comments表,它将有一个commentable_id,许多表将有一个commentable_id,表中的commentable_id将引用commentables.id(在本例中是a.id)。但是如果稍后将行添加到“base”表中会怎么样?您需要一次又一次地重新运行此语句(或为每个基表添加触发器)。如果只在注释生成后将行插入注释表,这不是更有意义吗?为什么是3(如果没有其他列,则插入无效)?关于CTE的想法很好,我会尝试一下。考虑到SQL
插入到B(ref\u id)
中,并且目标是去掉ref\u id,如果没有B.ref\u id,您会插入哪些列?