Sql 在插入新表时更新外键

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

我有表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 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;
  • 添加future外键列,但不包含约束本身:

    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,您会插入哪些列?