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

How can I resolve a duplicate key that doesn't exist in MySQL?

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

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

但是 none 存在:

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

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

这是创建 table:

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;

您的 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;

我相信这个查询会 return 多条记录,而那些多条记录将全部更新为 status = 1,这会导致错误。

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