【问题标题】:Merge several mySQL databases with equivalent structure合并多个具有等效结构的 mySQL 数据库
【发布时间】:2011-10-30 14:25:51
【问题描述】:
我想编写一个合并多个数据库的 php 脚本,并且我想在开始任何事情之前确定如何绕过它。
我有 4 个具有相同结构和几乎相同数据的数据库。我想在保留(或重新链接)外键的同时合并它们而没有任何重复条目。
例如有一个db1.product 表与db2.products 几乎相同,所以我想我必须在name 和description 列上使用LIKE 比较,以确保我只插入新的行。但是,当合并 orders 表时,我必须确保 productID 仍然表示正确的产品。
所以我想到了 2 个解决方案:
要么我为每个表使用insert into db1.x as select * from db2.x,然后创建新链接并使用触发器检查重复。
要么我删除重复的条目并更新新的外键(在删除约束之后),然后将行插入到主数据库中。
刚刚听说 MySQL Data Compare 和 Toad for mySQL,它们能帮我合并表吗?
有人可以告诉我什么应该是正确的解决方案吗?
对不起我的英语,谢谢!
【问题讨论】:
标签:
php
mysql
database
merge
【解决方案1】:
首先,您如何确定产品是否相同?您提到了名称和描述上的 LIKE 比较。您需要建立一个规则,说明产品在您的 db1、db2 等中是一个且相同的。
但是,我们假设产品的名称和描述是定义它的属性。
ALTER TABLE products ADD UNIQUE('name', 'description');
在您的所有数据库上运行它。
完成此操作后,选择要导入的数据库之一并运行以下查询:
INSERT IGNORE INTO db1.products SELECT * FROM db2.products;
对剩余的数据库重复。
当然,如果您无法确定要如何比较产品,这一切都会失败。
注意:切勿在列名中使用保留字,例如单词“name”。
【解决方案2】:
首先,祝你好运 - 听起来是一项棘手的工作。
其次,我不会使用 PHP 执行此操作 - 我会编写 SQL 来完成这项工作,假设这是一次性迁移任务而不是重复任务。
作为一种方法,我会执行以下操作。
使用您想要的架构创建一个数据库 - 听起来您的 4 个数据库中的每一个在架构上都有细微的变化。现在只需创建模式,不用担心数据。
-
创建一个“工作”数据库,具有相同的架构,但包含“旧”主键的列。例如:
表订单
order_id int 主键自增
old_order_id int 不为空
...其他列...
表 ORDER_LINE
order_line_id int 主键自增
old_order_line_id int 不为空
order_id int 外键
...其他列...
-
逐个表,从您的第一个源数据库插入您的工作数据库。让主键auto_increment,但把原来的主键放到“old_”列。
例如:
插入workingdb.orders
select 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
冲洗并重复其他数据库。
最后,将工作数据库中的数据复制到“正确”的数据库中。这是可选的 - 它可能有助于保留旧 ID 以进行查找等。