如何解析MySQL中不存在的重复密钥?

时间:2015-02-20 20:23:20

标签: mysql sql duplicates

为什么此重复键会引发错误?

UPDATE myTable SET status = 1 WHERE status != 1 AND age IN (1,2,3);
#Duplicate entry '2015-02-20-1-1' for key 'date_status_id' 0.82 secs

但不存在:

SELECT * FROM myTable WHERE `date` = '2015-02-20' AND `status` = 1 AND `age` = 1;
#No results

date_status_age (date, status, age)是唯一的UNIQUE索引。

这是创建表:

CREATE TABLE `campaign_stats` (
  `age` int(11) NOT NULL,
  `date` date NOT NULL,
  `status` int(11) NOT NULL,
  UNIQUE KEY `date_status_age` (`date`,`status`,`age`)
) ENGINE=InnoDB;

1 个答案:

答案 0 :(得分:2)

您的UNIQUE索引定义如下:

date_status_id (date, status, id)

并且您没有状态= 1的任何记录:

SELECT * FROM myTable WHERE `date` = '2015-02-20' AND `status` = 1 AND `id` = 1;

但您可能有更多状态记录!= 1:

SELECT * FROM myTable WHERE `date` = '2015-02-20' AND `status` != 1 AND `id` = 1;

我相信此查询将返回多条记录,并且这些多条记录将全部更新为status = 1,这会导致错误。

这里的问题是您已将ID定义为AUTO_INCREMENT,但由于没有与之关联的UNIQUE索引,因此您可以拥有多个具有相同ID的行。