合并几个具有等效结构的mySQL数据库

时间:2011-08-19 12:35:09

标签: php mysql database merge

我想编写一个合并多个数据库的php脚本,我想确定在开始之前如何绕过它。

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

例如,db1.product表与db2.products几乎相同,所以我想我必须在LIKE和{{1}上使用name比较}列,以确保我只插入新行。但是,当合并description表时,我必须确保orders仍然表明正确的产品。

所以我想到了两个解决方案:

  1. 我使用每个表productID然后创建新链接并使用触发器检查重复。

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

  3. 刚刚听说MySQL数据比较和Toad for mySQL,他们能帮我合并表吗?

  4. 有人能告诉我什么是正确的解决方案吗?

    抱歉我的英文,谢谢你!

2 个答案:

答案 0 :(得分:0)

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

但是,我们假设产品的名称和描述是定义它的属性。

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

在所有数据库上运行此功能。

完成后,选择一个要导入的数据库并运行以下查询:

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

重复其余数据库。

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

答案 1 :(得分:0)

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

其次,我不会用PHP做这件事 - 我会编写SQL来完成工作,假设这是一次性迁移任务而不是重复性任务。

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

  1. 使用您想要的架构创建数据库 - 听起来您的4个数据库中的每个数据库在架构中都有很小的变化。现在只需创建架构,不要担心数据。

  2. 使用相同的架构创建“工作”数据库,但使用“旧”主键列。例如:

    表订购 order_id int主键自动增量 old_order_id int不为null ......其他栏目......

    表ORDER_LINE order_line_id int主键自动增量 old_order_line_id int不为null order_id int外键 ......其他栏目......

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

    插入workingdb.orders select null,order_id,....其他列... 来自db1.orders

  4. 如果您有外键,请通过查找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。