2012-08-01 65 views
0

我想使用'insert into'mysql命令将table1内容移动到table2,但是table2可能具有'相同'主键。我想在执行insert语句时将table2的记录(具有相同的主键)替换为table1的记录。我可以使用'或替换'来实现这一点吗?从表1中插入或替换到表2中

+1

'重复的主键'是有点矛盾...... – 2012-08-01 15:56:17

+0

@MarcB我认为他的意思与表1的主键重复 – 2012-08-01 15:57:38

+0

我会'相同',而不是重复尊重英语。 – alrightgame 2012-08-01 15:59:10

回答

2

使用一个INSERT ... SELECT与对重复KEY UPDATE子句:

INSERT INTO table2 
    SELECT * FROM table1 ON DUPLICATE KEY UPDATE table2.field1 = table1.field1 

使用*为了简洁,但UPDATE子句中你必须单独指定字段,应该这么做插入和选择子句也是如此。

+0

那么当你试图在每个表中插入'like'主键时,mysql会做什么?它会抛出一个错误吗? – alrightgame 2012-08-01 16:07:55

+0

当你说“like”时,你的意思是重复的?然后通常是的;但它取决于您的服务器所处的模式。“ON DUPLICATE KEY”子句可以通过告诉服务器执行更新而不是抛出错误来规避该错误。 – 2012-08-01 16:15:51

3

尝试是这样的(不知道您的具体模式,这只能是一个例子)

INSERT INTO tbl_a (a,b,c) 
SELECT a,b,c FROM tbl_b 
ON DUPLICATE KEY UPDATE b = tbl_b.b, c = tbl_b.c 

从文档为INSERT on DUPLICATE

如果指定了对重复密钥更新,和行被插入,这会在UNIQUE索引或PRIMARY KEY中产生重复值,执行旧行的更新

0

如果在表2是在表1键重复的主键不被其他地方的外键称,最简单的方法是使用REPLACE ... INTO

“REPLACE作品酷似INSERT,不同之处在于,如果一个老表中的行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。“

所以,你会做这样的事情:

REPLACE INTO table2 (a, b, c) 
SELECT a, b, c FROM table1; 

它将table2为你的钥匙,所以任何行挑选出具有相同ID作为table1一排由table1的覆盖行数据。

+0

这真的取决于是否有外键在这里使用 - 如果有和他们正在使用级联删除 - 然后好关联的数据...这是因为'替换...到'删除然后插入 – ManseUK 2012-08-01 16:21:22

+0

已编辑为了体现这一点,谢谢。 – 2012-08-01 16:24:20