使用重复键导入MySQL记录

时间:2011-06-22 18:56:09

标签: mysql

我有两个具有相同表结构的MySQL数据库,每个数据库都填充了数千条记录。我需要将两者合并为一个数据库,但由于ID重复,我无法将其中一个导入到另一个数据库中。它是一个具有许多链接表的关系数据库(字段指向其他表记录ID)。

编辑:目标是从一个最终数据库中的两个数据库中获取数据,而不覆盖数据,并更新外键以匹配新记录ID。

我不确定如何合并这两个数据库。我可以编写一个脚本,但是有很多表,需要一段时间才能完成。我想知道是否有其他人遇到过这个问题,以及最好的解决方法吗?

5 个答案:

答案 0 :(得分:1)

只需忽略重复项即可。第一次插入密钥时,它将被插入。第二次被忽略。

INSERT IGNORE INTO myTable (SELECT * FROM myOtherTable );

请参阅完整的INSERT语法here

答案 1 :(得分:1)

诀窍是将一个数据库中的ID增加1000(或者某些东西不会与目标数据库中的数据重叠),然后导入它。

感谢大家的回答。

答案 2 :(得分:0)

重复的ID是否应该相互对应?您可以使用自动增量字段创建一个新表,并将现有键保存为两列。

但这只是一个'批量副本'。如果存在某种潜在的关系,则会决定如何组合数据。

答案 3 :(得分:0)

如果您有两个表A1和A2,并且想要将其合并到AA,则可以执行以下操作:

INSERT INTO aa SELECT * FROM A1;
INSERT INTO aa SELECT * FROM A2 ON DUPLICATE KEY 
  UPDATE aa.nonkeyfield1 = a1.nonkeyfield1,
         aa.nonkeyfield2 = a1.nonkeyfield2, ....;

这将覆盖带有A2数据的重复键的字段。

语法更简单的稍慢的方法是:

INSERT INTO aa SELECT * FROM A1;
REPLACE INTO aa SELECT * FROM A2;

这将执行相同的操作,但不会更新重复的行,而是首先从A1中删除行,然后从A2重新插入数据。

如果要将整个数据库与外键合并,这将无效,因为它会破坏表之间的链接。

如果你有一个完整的数据库并且想要覆盖数据
我将第一个数据库正常导入数据库A. 将第二个数据库导入数据库B.
将所有外键设置为on update cascade。 仔细检查一下。

现在对数据库B上的所有表运行以下语句。

 SELECT @increment:= MAX(pk) FROM A.table1;
 UPDATE B.table1 SET pk = pk + @increment WHERE pk IS NOT NULL 
   ORDER BY pk DESC;

where子句是为了阻止MySQL在严格模式下发出错误)

如果您在数据库中为每个表编写一个包含这两行的脚本,则可以将所有表插入数据库AA,记得在更新期间禁用外键检查

SET foreign_key_checks = 0;
... do lots of inserts ...
SET foreign_key_checks = 1;
祝你好运。

答案 4 :(得分:0)

使用自动编写的主键作为第一列创建新的数据库表。然后从数据库中添加列名并导入每个列名。然后删除旧的主要字段,并重命名新的字段以匹配您的主要名称。

相关问题