我有两个具有相同表结构的MySQL数据库,每个数据库都填充了数千条记录。我需要将两者合并为一个数据库,但由于ID重复,我无法将其中一个导入到另一个数据库中。它是一个具有许多链接表的关系数据库(字段指向其他表记录ID)。
编辑:目标是从一个最终数据库中的两个数据库中获取数据,而不覆盖数据,并更新外键以匹配新记录ID。
我不确定如何合并这两个数据库。我可以编写一个脚本,但是有很多表,需要一段时间才能完成。我想知道是否有其他人遇到过这个问题,以及最好的解决方法吗?
答案 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)
使用自动编写的主键作为第一列创建新的数据库表。然后从数据库中添加列名并导入每个列名。然后删除旧的主要字段,并重命名新的字段以匹配您的主要名称。