2012-09-22 70 views
0

为什么我的ON DUPLICATE KEY UPDATE语句无法正常工作,我正在以某种方式在我的表中没有重复项。随着下面的代码,我得到复制MYSQL重复键不能正常工作

CMS::insertQuery("INSERT INTO {table} SET canid=?, categoryid=? ON DUPLICATE KEY UPDATE canid=?, categoryid=?", array($emailCheck['id'], $id, $emailCheck['id'], $id)); 

DB:

CREATE TABLE `table` ( `canid` int(10) NOT NULL,  `categoryid` int(10) NOT NULL,  UNIQUE KEY `canid` (`canid`,`categoryid`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 

我试图电流线路运行:

CMS::insertQuery("INSERT INTO {table} SET canid=?, categoryid=? ON DUPLICATE KEY UPDATE canid=?, categoryid=? WHERE canid=?, categoryid=?", array($emailCheck['id'], $id, $emailCheck['id'], $id,$emailCheck['id'],$id)); 
+0

你对canid和categoryid有独特的组合键吗? –

+0

@ G-Nugget解释一下? –

+1

如果插入操作违反唯一键,那么'ON DUPLICATE KEY UPDATE'只执行更新部分。没有一个唯一的密钥,没有什么可以检查重复。我的第一个评论是不正确的,因为我的意思是,只要在任一列上都有一个唯一的键被触发,而不一定是两者,那么'UPDATE'就会被执行。 –

回答

4

这是因为你的避风港只是猜测没有提供您的模式,但是您的唯一密钥可以为空的列之一?

编辑:

正如@ G-掘金在评论中说,你需要在问题列上唯一键:如果你指定ON DUPLICATE KEY UPDATE

,和行插入 会在UNIQUE索引或PRIMARY KEY中导致重复值,MySQL 会执行旧行的UPDATE。

http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

你需要有这应该是唯一的列组合的唯一密钥。

如:

ALTER TABLE yourTable ADD UNIQUE KEY (`canid`, `categoryid`); 

此外,要求数据库的问题时,请包括SHOW CREATE TABLE有问题的表。

+0

否http://d.pr/i/NuBF –

+0

我不认为我有一个独特的关键,我不确定是否应该设置一个尽可能多的ID可以有相同的catid –

+0

@JessMcKenzie如果你只想要有一个canid和categoryid的组合,您应该在两列上使用唯一的组合索引。 –