合并具有相同设计的两个数据库(Mysql)

时间:2012-01-12 20:41:17

标签: mysql sql

我有两个具有相同设计的数据库,以及Mysql中的不同记录 有两个主表具有唯一的主键。 (我的意思是如果不同数据库中的两个记录具有相同的主键,则它们是相同的。)

这两个表与其他表有许多关系。但问题是小表PK在所有DB中都不是唯一的(自动增量)

现在我想合并这两个数据库的数据。

任何想法?

3 个答案:

答案 0 :(得分:2)

编辑:我认为我误读了你的声明,即密钥在数据库中是唯一的。在这种情况下,如果它已经在目标数据库中,我就不会从原始数据库中插入一行。您仍然可以使用相同的外键复制外键表。

基本上是这样的:

INSERT INTO MainTable (PK, field1, field2)
SELECT (PK, field1, field2)
FROM OldMainTable
WHERE PK NOT IN (SELECT PK FROM MainTable)

以下留下旧答案以防万一。

最好的办法是修改表格以获得OldPrimaryKey字段。然后,当您将数据插入目标数据库时,将原始PK存储在OldPrimaryKey字段中。然后,当您使用外键插入任何内容时,请查看FK与OldPrimaryKey字段的匹配并更新要匹配的外键。 (为了以防万一,创建外键的副本可能是个好主意!)

所以查询可能看起来像这样:

INSERT INTO MainTableTarget  (OldPrimaryKey, field1, field2...)
SELECT PrimaryKey as OldPrimaryKey, field1, field2...
FROM OldMainTable

INSERT INTO Table2Target ( OldTable2PK, MainTableForeignKey, fielda, fieldb...)
SELECT Table2PK as OldTable2PK, 
        (SELECT PK FROM MainTableTarget) as MainTableForeignKey,  --This get the FK to point at the newly created database record
        fielda,
        fieldb
FROM OldTable2

这可能是一种痛苦,但我认为这里没有任何非痛苦的选择......

哦,对不起,如果语法稍微偏离......我是一个T-SQL人,所以不太了解MySQL的语法。希望你能得到这个想法......

答案 1 :(得分:2)

这个答案在很大程度上取决于你的假设“如果不同数据库中的两个记录具有相同的主键,那么它们是相同的。” 假设您的数据是干净的,请将外键检查设置为0.然后

INSERT INTO db2.sometable

SELECT * FROM db1.sometable on duplicate key ignore

并且不插入忽略任何错误而忽略重复的忽略。对每个表执行此操作,然后将外键检查设置为1.如果您想要更加安全,可以对表进行拓扑排序并首先插入根表,同时保持外键检查处于活动状态。如果你有合成主键,所有的赌注都关闭,你需要重新分配更难的键。

答案 2 :(得分:1)

最简单的方法可能是为每个表使用这样的查询:

INSERT IGNORE INTO db2.sometable
SELECT * FROM db1.sometable

只需确保按正确的顺序处理表,这样就不会遇到外键问题(例如先做两个主表,然后是相关的表)