我有两个具有相同设计的数据库,以及Mysql中的不同记录 有两个主表具有唯一的主键。 (我的意思是如果不同数据库中的两个记录具有相同的主键,则它们是相同的。)
这两个表与其他表有许多关系。但问题是小表PK在所有DB中都不是唯一的(自动增量)
现在我想合并这两个数据库的数据。
任何想法?
答案 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
只需确保按正确的顺序处理表,这样就不会遇到外键问题(例如先做两个主表,然后是相关的表)