我在两列上有一个复合唯一键,“user_id”& “PROJECT_ID”。
当我尝试在单行或多行上运行DELETE查询时,出现错误。
ERROR 1062: 1062: Duplicate entry '87-1736' for key 'index_on_user_id_and_project_id'
SQL Statement:
DELETE FROM `members` WHERE `id`='39142'
该表具有单列主键,2个单列唯一索引(对于user_id和project_id),以及user_id和project_id上的1个复合唯一索引。数据库中没有外键。
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '0',
`project_id` int(11) NOT NULL DEFAULT '0',
`created_on` datetime DEFAULT NULL,
`mail_notification` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `index_on_user_id_and_project_id` (`user_id`,`project_id`),
KEY `index_members_on_user_id` (`user_id`),
KEY `index_members_on_project_id` (`project_id`)
此错误仅显示某些条目(很多条目),并且始终是那些有问题的条目(例如上面显示的87和1736对)。
我尝试过查找重复项,但没有找到。我能够在字段中找到一些带有“0”的条目,我删除了这些条目。没有找到NULL字段。
我尝试过:
alter ignore table ... add unique index (user_id, project_id)
,它没有发现重复,发出警告关于IGNORE被弃用,并没有解决如何删除这些有问题的条目?
答案 0 :(得分:1)
delete
语句本身不可能生成重复的键错误。至少,我想不出任何方式可以在一个完整的数据库中发生这种情况。毕竟,如果你删除一个值,它就不会与另一个值发生冲突。
这样就有可能发生其他事情。唯一合理的选择是桌面上的触发器。遗憾的是,错误消息并没有指定表名,但这是我能够轻易想到的唯一原因。
答案 1 :(得分:0)
在我将目标表(t1)绑定到历史记录表(t1_hist)之前,我已经碰到了这个。 t1_hist由对t1更改的触发器填充(任何添加/更改/删除)。一旦我从t1_hist中删除了不需要的记录,我就能从t1中删除。这需要从t1_hist表中删除第二遍,因为它记录了我从t1删除的内容。
简单地说,我的是:DELETE FROM t1 WHERE customer_number> 50000;
同样的错误。从t1_hist开始(和最后一次)相同,那就没问题了。