我想编写一个合并多个数据库的php脚本,我想确定在开始之前如何绕过它。
我有4个数据库,它们具有相同的结构和几乎相同的数据。我希望在保留(或重新链接)外键的同时合并它们而不会有任何重复的条目。
例如,db1.product
表与db2.products
几乎相同,所以我想我必须在LIKE
和{{1}上使用name
比较}列,以确保我只插入新行。但是,当合并description
表时,我必须确保orders
仍然表明正确的产品。
所以我想到了两个解决方案:
我使用每个表productID
然后创建新链接并使用触发器检查重复。
要么删除重复的条目并更新新的外键(在删除约束之后),然后将行插入主数据库。
刚刚听说MySQL数据比较和Toad for mySQL,他们能帮我合并表吗?
有人能告诉我什么是正确的解决方案吗?
抱歉我的英文,谢谢你!答案 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来完成工作,假设这是一次性迁移任务而不是重复性任务。
作为一种方法,我会做以下事情。
使用您想要的架构创建数据库 - 听起来您的4个数据库中的每个数据库在架构中都有很小的变化。现在只需创建架构,不要担心数据。
使用相同的架构创建“工作”数据库,但使用“旧”主键列。例如:
表订购 order_id int主键自动增量 old_order_id int不为null ......其他栏目......
表ORDER_LINE order_line_id int主键自动增量 old_order_line_id int不为null 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。