如何解决 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 的行。
为什么这个重复键会引发错误?
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 的行。