【问题标题】:Merge several mySQL databases with equivalent structure合并多个具有等效结构的 mySQL 数据库
【发布时间】:2011-10-30 14:25:51
【问题描述】:

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

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

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

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

  1. 要么我为每个表使用insert into db1.x as select * from db2.x,然后创建新链接并使用触发器检查重复。

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

  3. 刚刚听说 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 来完成这项工作,假设这是一次性迁移任务而不是重复任务。

      作为一种方法,我会执行以下操作。

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

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

        表订单 order_id int 主键自增 old_order_id int 不为空 ...其他列...

        表 ORDER_LINE order_line_id int 主键自增 old_order_line_id int 不为空 order_id int 外键 ...其他列...

      3. 逐个表,从您的第一个源数据库插入您的工作数据库。让主键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
      
      1. 冲洗并重复其他数据库。

      2. 最后,将工作数据库中的数据复制到“正确”的数据库中。这是可选的 - 它可能有助于保留旧 ID 以进行查找等。

      【讨论】:

        猜你喜欢
        • 2013-03-24
        • 2013-09-06
        • 2012-05-31
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多