Объединить несколько баз данных MySQL с эквивалентной структурой - PullRequest
1 голос
/ 19 августа 2011

Я хотел бы написать сценарий php, который объединяет несколько баз данных, и я хотел бы быть уверен, как обойти его, прежде чем что-либо запускать.

У меня есть 4 базы данных, которые имеют одинаковую структуру и почти одинаковые данные. Я хочу объединить их без повторяющихся записей, сохранив (или повторно связав) внешние ключи.

Например, есть таблица db1.product, которая почти совпадает с db2.products, поэтому я думаю, что мне придется использовать сравнение LIKE для столбцов name и description, чтобы быть уверенным, что я вставляю только новые строк. Но затем, при объединении таблицы orders я должен убедиться, что productID по-прежнему указывает на правильный продукт.

Итак, я подумал о 2 решениях:

  1. Либо я использую для каждой таблицы insert into db1.x as select * from db2.x, а затем создаю новые ссылки и проверяю дубликаты с помощью триггеров.

  2. Либо я удаляю повторяющиеся записи и обновляю новые внешние ключи (после удаления ограничений), а затем вставляю строку в основную базу данных.

  3. Только что слышал о MySQL Data Compare и Toad для mySQL, могут ли они помочь мне объединить таблицы?

Может ли кто-нибудь указать мне, каким должно быть правильное решение?

извините за мой английский и спасибо!

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

Во-первых, удачи с этим - звучит как хитрая работа.

Во-вторых, я бы не стал делать это с PHP - я бы написал SQL для этой работы, предполагая, что это одноразовая задача миграции, а не повторяющаяся задача.

В качестве подхода я бы сделал следующее.

  1. Создайте базу данных с нужной вам схемой - похоже, каждая из ваших 4 баз данных имеет небольшие вариации в схеме. Просто создайте схему сейчас, не беспокойтесь о данных.

  2. Создать «рабочую» базу данных с той же схемой, но со столбцами для «старых» первичных ключей. Например:

    стол ЗАКАЗАТЬ order_id int автоинкремент первичного ключа old_order_id int не нуль ... другие столбцы ...

    таблица ORDER_LINE order_line_id int автоинкремент первичного ключа old_order_line_id int не нуль order_id int внешний ключ ... другие столбцы ...

  3. Таблица за таблицей Вставьте в вашу рабочую базу данных из вашей первой исходной базы данных. Позвольте первичным ключам auto_increment, но поместите оригинальный первичный ключ в столбец "old_". Например:

    вставить в workingdb.orders выберите null, order_id, .... другие столбцы ... из db1.orders

Если у вас есть внешний ключ, заполните его, найдя запись в столбце old_. Например:

insert into workingdb.order_line
select null, ol.order_line_id, o.order_id
from   db1.order_line ol, 
       workingdb.order
where  ol.order_id = o.old_order_id
  1. Промыть и повторить для других баз данных.

  2. Наконец, скопируйте данные из вашей рабочей базы данных в «правильную» базу данных. Это необязательно - это может помочь сохранить старые идентификаторы для поиска и т. Д.

0 голосов
/ 19 августа 2011

Во-первых, как вы определяете, являются ли продукты одинаковыми? Вы упомянули, как сравнение по имени и описанию. Вам нужно установить правило, которое гласит, что продукт является одним и тем же в вашем db1, db2 и т. Д.

Однако давайте предположим, что название и описание продукта являются атрибутами, которые его определяют.

ALTER TABLE products ADD UNIQUE('name', 'description');

Запустите это на всех ваших базах данных.

После этого выберите одну из баз данных, в которую вы хотите импортировать, и выполните следующий запрос:

INSERT IGNORE INTO db1.products SELECT * FROM db2.products;

Повторите эти действия для остальных баз данных.

Естественно, все это терпит неудачу, если вы не можете определить, как вы собираетесь сравнивать продукты. Примечание. Никогда не используйте зарезервированные слова для имен столбцов, например слово «имя».

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