2011-08-19 35 views
1

我想编写一个合并多个数据库的php脚本,我想确保在我启动任何东西之前如何绕过它。合并几个等效结构的mySQL数据库

我有4个数据库具有相同的结构和几乎相同的数据。我想合并它们而没有任何重复的条目,同时保留(或重新链接)外键。

比如有一个db1.product表几乎是一样的db2.products,所以我想我将不得不使用LIKE比较上namedescription列,以确保我只插入新行。但是,当合并orders表时,我必须确保productID仍然指示正确的产品。

于是我想到的2个解决方案:

  1. 要么我为每个表使用insert into db1.x as select * from db2.x,然后作出新的联系并为您使用重复的触发器。

  2. 我可以删除重复的条目并更新新的外键(在删除约束之后),然后将行插入主数据库。

  3. 刚刚听说MySQL的数据比较和蟾蜍,他们可以帮我合并表吗?

有人可以告诉我什么应该是正确的解决方案吗?

对不起,我的英语,谢谢!

回答

0

首先,您如何确定产品是否相同?你提到LIKE比较名称和描述。您需要建立一条规则,说明产品在您的db1,db2等产品中是相同的。

但是,让我们假设产品的名称和描述是定义它的属性。在所有的数据库

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

运行此。

你这样做后,选择要导入并运行以下查询数据库之一:

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

重复其余数据库。

当然,如果您无法确定如何比较产品,这一切都会失败。 注意:从不使用保留字作为列名,例如单词“name”。

0

首先,祝你好运 - 听起来像一个棘手的工作。

其次,我不会这样做与PHP - 我会写SQL来完成这项工作,假设这是一次性迁移任务,而不是一个重复的任务。

作为一种方法,我会做以下工作。

  1. 用你想要的模式创建一个数据库 - 听起来你的4个数据库中的每一个在模式上都有很小的变化。现在就创建模式,不要担心数据。

  2. 创建一个“工作”数据库,具有相同的模式,但具有“旧”主键的列。例如:

    表顺序 的order_id int主键自动增加 old_order_id诠释不为空 ...等栏目...

    表ORDER_LINE order_line_id int主键自动增加 old_order_line_id诠释不为空 ORDER_ID int外键 ...其他列...

  3. 按表格从第一个源数据库插入到您的工作数据库中。让主键auto_increment,但将原始主键放入“old_”列。 例如:

    插入到workingdb.orders 选择空,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. 最后,将工作数据库中的数据复制到“正确的”数据库中。这是可选的 - 它可以帮助保留用于查找的旧ID等。