У меня есть таблица с записями, которые могут ссылаться на другую строку в той же таблице, поэтому между строками в одной и той же таблице есть отношения родитель-потомок.
Я пытаюсь создать такую же данные для другого пользователя, чтобы они могли видеть и управлять своей собственной версией этой структуры через веб-интерфейс, где эти строки отображаются в виде дерева.
Проблема заключается в том, что при групповой вставке этих данных путем изменения только user_id, я потерять связь между строками, потому что значения parent_id будут недопустимыми для этих новых записей, и они также должны быть обновлены с помощью вновь созданных идентификаторов.
Вот что я пробовал: (не работает)
- Итерировать по main_table
- копировать и вставлять значения * stati c после каждого
- делать еще одну вставку во временную таблицу для хранения старых и новых идентификаторов
- обновить старые parent_ids новыми идентификаторами после того, как l oop заканчивается
Моя попытка сделать это (последний шаг здесь не включен)
create or replace function test_x()
returns void as
$BODY$
declare
r RECORD;
userId int8;
rowPK int8;
begin
userId := (select 1)
create table if not exists id_map (old_id int8, new_id int8);
create table if not exists temp_table as select * from main_table;
for r in select * from temp_table
loop
rowPK := insert into main_table(id, user_id, code, description, parent_id)
values(nextval('hibernate_sequence'), userId, r.code, r.description, r.parent_id) returning id;
insert into id_map (old_id, new_id) values (r.id, rowPK);
end loop;
end
$BODY$
language plpgsql;
* 102 1 * Моя PostgreSQL версия 9.6.14.
DDL ниже для тестирования.
create table main_table(
id bigserial not null,
user_id int8 not null,
code varchar(3) not null,
description varchar(100) not null,
parent_id int8 null,
constraint mycompkey unique (user_id, code, parent_id),
constraint mypk primary key (id),
constraint myfk foreign key (parent_id) references main_table(id)
);
insert into main_table (id, user_id, code, description, parent_id)
values(0, 0, '01', 'Root row', null);
insert into main_table (id, user_id, code, description, parent_id)
values(1, 0, '001', 'Child row 1', 0);
insert into main_table (id, user_id, code, description, parent_id)
values(2, 0, '002', 'Child row 2', 0);
insert into main_table (id, user_id, code, description, parent_id)
values(3, 0, '002', 'Grand child row 1', 2);
Как написать процедуру для выполнения sh this?
Заранее спасибо.