Обновление внешних ключей при вставке в новую таблицу - PullRequest
0 голосов
/ 07 января 2012

У меня есть таблица A (id).

Мне нужно

  • создать таблицу B (id)
  • добавить внешний ключ в таблицу A, которая ссылается на B.id
  • для каждой строки в A, вставьте строку в B и обновите A.b_id вновь добавленной строкой в ​​B

Возможно ли это сделать без добавления временного столбца в 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;

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Предполагая, что:

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;
0 голосов
/ 08 января 2012
  1. Добавить будущий столбец внешнего ключа, но без самого ограничения:

    ALTER TABLE A ADD b_id integer;
    
  2. Заполнить новый столбец значениями:

    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;
    
  3. Создайте другую таблицу:

    CREATE TABLE B (
      id integer CONSTRAINT PK_B PRIMARY KEY
    );
    
  4. Добавьте строки в новую таблицу, используя ссылочный столбец существующей:

    INSERT INTO B (id)
    SELECT b_id
    FROM A;
    
  5. Добавьте ограничение FOREIGN KEY:

    ALTER TABLE A
    ADD CONSTRAINT FK_A_B FOREIGN KEY (b_id) REFERENCES B (id);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...