Как я могу объединить данные между 2 непустыми базами данных MySQL, не вызывая столкновения первичного ключа и внешнего ключа - PullRequest
2 голосов
/ 16 июня 2019

Как я могу перенести данные из одной базы данных в другую базу данных, не относящуюся к Emoty, без конфликта первичных ключей, если структуры базы данных идентичны.Это то, что я имею в виду: база данных A имеет 100 таблиц, каждая из которых связана с другими таблицами с использованием первичного и внешнего ключей.Каждая таблица содержит много данных.

Данные в виде B содержат данные того же типа, которые хранятся в нем с отношениями первичного и внешнего ключей.Эти две базы данных идентичны, но данные, хранящиеся в них, не идентичны.Я хочу объединить две базы данных, не вызывая конфликт между первичным и внешним ключами.

Базы данных mysql.Какое может быть возможное решение?

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Есть несколько элегантных способов решить эту проблему

Взаимозачет

Зависимость : числовые идентификаторы с автоматическим приращением

Вы переносите первую базу данных, смотрите, каков максимальный идентификатор, и добавляете его ко всем значениям первичного ключа и внешнего ключа при переносе второй базы данных. Не очень сложно, но вы, возможно, захотите сгенерировать свой код, а не исправлять вручную, если таблиц много. Если ваша база данных находится в 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, так что вы сможете сопоставить что-то еще с этим.

Когда вы закончите миграцию, вы можете удалить временные столбцы.

Реальная сделка

Лучшим решением, вероятно, будет сочетание вышеперечисленного.

1 голос
/ 16 июня 2019

Ограничения по внешнему ключу являются средством сохранения согласованности и целостности данных.

Конечно, вы можете просто отключить проверку ограничений и вставить все данные каждой таблицы, но это нарушает согласованность, поскольку у вас будут дублирующиеся ключи и вы не сможете отслеживать ссылки.

Предполагая, что для вас важно сохранить эту целостность после объединения, вам нужно будет найти способ сделать первичные ключи уникальными, т. Е. Чтобы для каждой данной таблицы из A набор первичных ключей не имел общих элементов с соответствующая таблица из Б.

Если ваши первичные ключи являются уникальными строками (GUID), это, вероятно, не проблема. Вы можете попытаться отключить ограничения, вставить данные и снова включить ограничения. И затем убедитесь, что количество объединенных строк = row_from_A + columns_from_B.

Если у вас есть автоинкрементные целочисленные первичные ключи, вы можете попытаться настроить одну из баз данных так, чтобы ключи имели разные диапазоны, и не конфликтовали друг с другом. Например, если все ключи в базе данных A меньше 1000000, вы можете создать новую базу данных B2 , которая является копией B, но вы добавляете 1000000 к каждому первичному ключу. Тогда вы можете объединить A и B2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...