Если вам не нужно удалять дубликаты, вы можете сделать это для каждой таблицы
insert into db1.tablea
select * from db2.tablea ;
Некоторые осложнения:
- если в таблицах есть столбцы идентификаторов, необходимо убедиться, что они не конфликтуют, заменив старые идентификаторы новыми идентификаторами
- но, поскольку идентификаторы - это ключи, связывающие таблицы, необходимо убедиться, что новые идентификаторы совпадают в каждой таблице.
Вот быстрый и грязный способ сделать это:
- Найти самый высокий идентификатор в таблице любой в первой базе данных.
- Назовите это max_key_db1.
- Затем обновите все ключи во второй базе данных, чтобы они были current_value плюс max_key_db1.
Обратите внимание, что вам нужно обновить как первичные, так и внешние ключи, чтобы это работало, например ::
update db2.tablea set id = id + max_key_db1, foreign_id = foreign_id + max_key_db1;
update db2.tableb set id = id + max_key_db1, a_id = a_id + max_key_db1;
etc.
Теперь у вас есть самосогласованный db2 со всеми ключами (первичными и внешними) со значениями, которых нет в db1; другими словами, ваши ключи уникальны в обеих базах данных.
Теперь вы можете вставить строки из db2 в db1:
insert into db1.tablea
select * from db2.tablea ;
Обратите внимание, что не будет работать, если таблицы, вставленные в них, создают свои собственные идентификаторы, используя автоинкремент или триггеры; в этом случае вам придется явно указать ciolumns и отключить все автоматически генерируемые идентификаторы:
insert into db1.tablea( id, foreign_id, col1, ...)
select id, foreign_id, col1 from db2.tablea ;
Кроме того, вы можете оставить db2 без изменений, выполнив все это за один шаг для каждой таблицы:
insert into db1.tablea( id, foreign_id, col3, col4)
select id + max_key_db1, foreign_id + max_key_db1, col3, col4 from db2.tablea ;
Конечно, делайте все это внутри транзакции и не выполняйте фиксацию, пока не убедитесь, что получили все таблицы и все они верны. И сделайте это на копиях ваших баз данных.
Теперь, поскольку вы использовали самый высокий ключ в db1 независимо от таблицы, вероятно, ваши идентификаторы не будут последовательными, но кого это волнует? Ключи - это ключи. Что вам нужно будет сделать, это сбросить любой auto_increment или последовательность для каждой таблицы, чтобы следующий автоматически сгенерированный ключ был выше, чем самый высокий ключ в этой таблице. Как это сделать, зависит от того, какую СУБД вы используете.