Предположим, у вас есть две таблицы, которые находятся в отношении один к одному; то есть первичный ключ дочерней таблицы также является внешним ключом, который связывает его с родительской таблицей. Предположим также, что первичным ключом родителя является поле идентификатора (монотонно увеличивающееся целое число, которое назначается базой данных при вставке записи).
Предположим, вам необходимо скопировать записи из этих двух таблиц во вторую пару идентичных таблиц - первичный ключ родительского элемента - это идентификатор, а внешний ключ, связывающий дочерний элемент с родительским, также является первичным ключом дочернего элемента.
Как мне скопировать записи из одного набора таблиц в другой набор?
В настоящее время у меня есть три решения, но я хотел бы знать, есть ли другие, которые лучше.
Опция 1: Временно отключить
личность в пункте назначения
родительская таблица. Копировать записи из
родительская таблица, затем дочерняя таблица,
сохраняя те же значения для
основной ключ. Скрестите пальцы, которые
нет конфликтов (значение
первичный ключ исходной таблицы уже
существует в таблице назначения).
Вариант 2: Временно добавить столбец в
родительская таблица назначения для хранения
«старый» (исходный) первичный ключ. копия
записи из родительской таблицы,
позволяя базе данных назначать новый
первичный ключ, но сохраняя старый
первичный ключ во временном столбце.
Копировать записи из дочерней таблицы,
присоединение исходной дочерней таблицы к
родительская таблица назначения через
старый первичный ключ, используя соединение с
вставить запись в
дочерний стол назначения с новым
основной ключ. Бросьте временный
столбец из родительского пункта назначения
таблица.
Вариант 3: Копировать последовательно
запись за записью, сначала от родителя
родителю, потом ребенку, используя
БД предоставил "личность последнего
вставлена запись "функции для обеспечения
что ссылка поддерживается.
Из этих вариантов, я думаю, вариант 2 - мое предпочтение. Кто-нибудь предпочитает один из двух других вариантов, и если да, то почему? У кого-нибудь есть другое решение, которое "лучше"?