2012-01-12 196 views
1

我有两个数据库具有相同的设计,而不同的记录在MySQL 有一个唯一的主键两个主表。 (我的意思是,如果两个记录在不同的数据库具有相同的主键,他们是相同的。)合并两个数据库具有相同的设计(MySQL的)

这两个表有一定的多对多关系,其他表。但问题是小表的PK是不是在所有的数据块(自动递增)独特

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

任何想法?

+0

请附上您的代码/数据库结构,使我们可以看到,到目前为止你有什么并更好地了解you'ld一样,如果你使用的是自动增量的主键做什么 – Tom 2012-01-12 20:48:47

+0

,您的企业平等的假设是错的。 – 2012-01-12 21:10:08

+0

你需要主键保持不变吗? – 2012-01-12 21:49:01

回答

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

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

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

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

+0

没有办法不会遇到外键问题。忽略这个错误并不会让它神奇地消失... – CodeRedick 2012-01-12 21:35:26

+0

他以正确的顺序说...如果对表依赖关系进行拓扑排序,你可以做到这一点。 – 2012-01-12 21:42:32

+0

@Telos - 他已经说过两个具有相同PK的记录是相同的,所以使用INSERT IGNORE是合适的。 – 2012-01-12 21:59:59

2

这个答案在很大程度上取决于你的假设:“如果两个记录在不同的数据库具有相同的主键,他们都是一样的。” 假设你的数据是干净的,设置外键检查为0,然后

INSERT INTO db2.sometable 

SELECT * FROM db1.sometable on duplicate key ignore 

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

+0

我想我喜欢这个答案比我更好,因为你提到的错误处理的原因。 – 2012-01-17 14:24:57

相关问题