Я прошу ваше мнение узнать, возможно ли это, потому что я ноб, и, возможно, я пытаюсь сделать это совершенно неправильно. Я много искал, но ничего не нашел, возможно, не используя правильные критерии поиска.
Я использую Postgresql 9.1. Я упростил ситуацию, чтобы понять методПовторяющиеся данные по таблицам, содержащим референции Идентификаторы
У меня есть 3 таблицы:
- таблицу А (мастер)
- таблица В (связанном с таблицей А)
- таблицей С (связанным с таблицей Б)
(см схему)
Таблица A
id_A | data_A
-----+--------
A01 | dataA01
A02 | dataA02
Таблица B
id_B | ref_id_A | data_B
-----+----------+--------
B01 | A01 | dataB01
B02 | A01 | dataB02
B03 | A02 | dataB03
B04 | A02 | dataB04
B05 | A02 | dataB05
B06 | A02 | dataB06
Таблица C
id_C | ref_id_B | data_C
-----+----------+--------
C01 | B01 | dataC01
C02 | B01 | dataC02
C03 | B02 | dataC03
C04 | B02 | dataC04
То, что я пытаюсь сделать, это скопировать все данные, связанные с таблицей А, сохраняя все данные и referencies, которые хранятся в таблицах B и C с новыми идентификаторами. Он должен работать, как копирование и вставка, чтобы поддерживать старые версии во время работы над новым
дубликата A01 -> A03
Таблица A
id_A | data_A
-----+--------
A01 | dataA01
A02 | dataA02
A03 | dataA01
Таблица B
id_B | ref_id_A | data_B
-----+----------+--------
B01 | A01 | dataB01
B02 | A01 | dataB02
B03 | A02 | dataB03
B04 | A02 | dataB04
B05 | A02 | dataB05
B06 | A02 | dataB06
B07 | A03 | dataB01
B08 | A03 | dataB02
Таблица C
id_C | ref_id_B | data_C
-----+----------+--------
C01 | B01 | dataC01
C02 | B01 | dataC02
C03 | B02 | dataC03
C04 | B02 | dataC04
C05 | B07 | dataC01
C06 | B07 | dataC02
C07 | B08 | dataC03
C08 | B08 | dataC04
Я написал этот запрос, чтобы дублировать А01 и он держит отлично данные в таблице B, но я не в состоянии дублировать данные в таблице C
WITH new_id_A as
(insert into table_A (id_A, data_A) (select id_A, data_A from table_A where id_A='A01') returning id_A)
insert into table_B (ref_id_A, data_B) select (select id_A from new_id_A) as ref_id_A, data_B from table_B where ref_id_A='A01';
Я пробовал разные подходы, но без каких-либо результатов
я могу выполнить задача легко с помощью кода, но я бы предпочел, чтобы закончить его в то базе данных в одной транзакции
Спасибо за ваше внимание
Как вы генерировать идентификаторы в таблицах?В идеале это будет последовательность. В этом случае вставка «Копия» данных не должна быть сложной задачей. – Bulat
Вы можете написать триггер, чтобы обновить «Таблицу B» новым идентификатором, когда изменяется таблица «A». – Colin
@Bulat ID - это серийный автоинкрементный, без возможности изменить структуру таблицы для хранения буквенно-цифровых идентификаторов без изменения всех таблиц. Но это хорошая идея, если я сделаю новый db –