Есть несколько элегантных способов решить эту проблему
Взаимозачет
Зависимость : числовые идентификаторы с автоматическим приращением
Вы переносите первую базу данных, смотрите, каков максимальный идентификатор, и добавляете его ко всем значениям первичного ключа и внешнего ключа при переносе второй базы данных. Не очень сложно, но вы, возможно, захотите сгенерировать свой код, а не исправлять вручную, если таблиц много. Если ваша база данных находится в BCNF, то это должно быть возможно. Если нет, то вы можете изменить свою схему на BCNF и выбрать это решение.
Идентификация строк по чему-то уникальному
Зависимость : FD в таблицах.
Вы insert
select
в целевую базу данных таким образом, что все записи получат правильные значения внешнего ключа из-за используемой функциональной зависимости.
Временные идентификаторы
Зависимость : Время
Вы создаете кластер column
(возможно, из одного column
) для каждой имеющейся у вас таблицы и сохраняете идентификаторы второй таблицы в новых временных столбцах при выполнении миграции второй базы данных и используйте это значение, когда будете указывать записи, на которые нужно указать.
Пример схемы:
пользователей (идентификатор, имя пользователя, адрес электронной почты, пароль)
профили (id, user_id, имя, описание, оценка)
В целевой базе данных вы переносите первую базу данных, а затем меняете схему на
пользователей (идентификатор, имя пользователя, адрес электронной почты, пароль, идентификатор_источника)
профили (идентификатор, идентификатор пользователя, имя, описание, оценка, идентификатор_источника)
Когда вы переносите users
из второй базы данных, вы insert
таким образом, что вы устанавливаете source_id
в целевой базе данных равным users.id
исходной базы данных. Затем, когда вы переносите профили, вы также insert
таким образом, что вы устанавливаете user_id
в значение users.id
, где source_id
соответствует источнику id
. Вы также устанавливаете profiles.source_id
для записи исходного профиля id
, так что вы сможете сопоставить что-то еще с этим.
Когда вы закончите миграцию, вы можете удалить временные столбцы.
Реальная сделка
Лучшим решением, вероятно, будет сочетание вышеперечисленного.