Объединение двух баз данных с одинаковым дизайном (Mysql) - PullRequest
1 голос
/ 13 января 2012

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

Эти две таблицы имеют отношение многие ко многим к другим таблицам.Но проблема в том, что маленькие таблицы PK не уникальны во всех БД (автоинкремент)

Теперь я хочу объединить данные этих двух баз данных.

Любая идея?

Ответы [ 3 ]

2 голосов
/ 13 января 2012

РЕДАКТИРОВАТЬ: я думаю, что я неправильно понял ваше утверждение, что ключи уникальны для всех баз данных. В этом случае я бы просто не вставил строку из исходной базы данных, если она уже находится в целевой базе данных. Тогда вы все равно сможете копировать таблицы внешних ключей с теми же внешними ключами.

так в основном:

INSERT INTO MainTable (PK, field1, field2)
SELECT (PK, field1, field2)
FROM OldMainTable
WHERE PK NOT IN (SELECT PK FROM MainTable)

Оставив старый ответ ниже на всякий случай.

Лучше всего изменить таблицы так, чтобы в них было поле OldPrimaryKey. Затем, когда вы вставляете данные в целевую базу данных, сохраняйте исходный PK в поле OldPrimaryKey. Затем, когда вы вставляете что-либо с внешним ключом, ищите соответствие FK до поля OldPrimaryKey и обновляйте внешний ключ для соответствия. (Вероятно, хорошая идея создать копию внешнего ключа на всякий случай!)

ТАК что запросы могут выглядеть примерно так:

INSERT INTO MainTableTarget  (OldPrimaryKey, field1, field2...)
SELECT PrimaryKey as OldPrimaryKey, field1, field2...
FROM OldMainTable

INSERT INTO Table2Target ( OldTable2PK, MainTableForeignKey, fielda, fieldb...)
SELECT Table2PK as OldTable2PK, 
        (SELECT PK FROM MainTableTarget) as MainTableForeignKey,  --This get the FK to point at the newly created database record
        fielda,
        fieldb
FROM OldTable2

Возможно, это будет боль, но я не думаю, что здесь есть какие-то безболезненные варианты ...

О, и извините, если синтаксис немного нарушен ... Я парень по T-SQL, поэтому не знаю синтаксис MySQL. Надеюсь, вы поняли, хотя ...

2 голосов
/ 13 января 2012

Этот ответ сильно зависит от вашего предположения о том, что «если две записи в разных базах данных имеют одинаковые первичные ключи, они одинаковы». Предполагая, что ваши данные чисты, установите проверки внешнего ключа на 0. Тогда

INSERT INTO db2.sometable

SELECT * FROM db1.sometable on duplicate key ignore

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

1 голос
/ 13 января 2012

Самый простой способ, вероятно, будет использовать такой запрос для каждой таблицы:

INSERT IGNORE INTO db2.sometable
SELECT * FROM db1.sometable

Просто убедитесь, что вы обрабатываете таблицы в правильном порядке, чтобы не столкнуться с проблемами внешнего ключа (например, сначала выполните две основные таблицы, а затем связанные таблицы)

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