DELETE 查询抛出:错误 1062 Duplicate entry 'X-Y' for key;但 table 中没有重复项
DELETE Query throws: Error 1062 Duplicate entry 'X-Y' for key; but no duplicates in table
我在两列上有一个复合唯一键,"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'
table有一个单列主键,2个单列唯一索引(user_id和project_id),user_id和1个复合唯一索引project_id。数据库中没有外键。
`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 对)。
我尝试查找重复项,但找到了 none。我能够在其中找到一些字段中带有“0”的条目,然后我删除了这些条目。未找到 NULL 字段。
我试过了:
- 查找重复项,找到 none。
- 在索引字段中寻找零值或NULL值,已删除,但未解决
- 去掉复合唯一索引,没有解决。
alter ignore table ... add unique index (user_id, project_id)
,没有发现重复项,抛出了一个关于 IGNORE 被弃用的警告,并没有解决
如何删除这些有问题的条目?
delete
语句本身不可能产生重复键错误。至少,我想不出在一个完整的数据库中发生这种情况的任何方式。毕竟,如果您要删除一个值,它不能与另一个值冲突。
这留下了发生其他事情的可能性。唯一合理的选择是 table 上的触发器。不幸的是,错误消息没有指定 table 名称,但这是我很容易想到的唯一原因。
我之前遇到过这个问题,当时我将目标 table (t1) 与历史 table (t1_hist) 相关联。 t1_hist 由对 t1 更改的触发器填充(任何 add/change/delete)。一旦我从 t1_hist 中删除不需要的记录,我就能够从 t1 中删除。这需要从 t1_hist table 中进行第二遍删除,因为它记录了我从 t1 中删除的内容。
简单地说,我的是:DELETE FROM t1 WHERE customer_number > 50000;
同样的错误。首先(和最后)从 t1_hist 做同样的事情,然后没问题。
我在两列上有一个复合唯一键,"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'
table有一个单列主键,2个单列唯一索引(user_id和project_id),user_id和1个复合唯一索引project_id。数据库中没有外键。
`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 对)。
我尝试查找重复项,但找到了 none。我能够在其中找到一些字段中带有“0”的条目,然后我删除了这些条目。未找到 NULL 字段。
我试过了:
- 查找重复项,找到 none。
- 在索引字段中寻找零值或NULL值,已删除,但未解决
- 去掉复合唯一索引,没有解决。
alter ignore table ... add unique index (user_id, project_id)
,没有发现重复项,抛出了一个关于 IGNORE 被弃用的警告,并没有解决
如何删除这些有问题的条目?
delete
语句本身不可能产生重复键错误。至少,我想不出在一个完整的数据库中发生这种情况的任何方式。毕竟,如果您要删除一个值,它不能与另一个值冲突。
这留下了发生其他事情的可能性。唯一合理的选择是 table 上的触发器。不幸的是,错误消息没有指定 table 名称,但这是我很容易想到的唯一原因。
我之前遇到过这个问题,当时我将目标 table (t1) 与历史 table (t1_hist) 相关联。 t1_hist 由对 t1 更改的触发器填充(任何 add/change/delete)。一旦我从 t1_hist 中删除不需要的记录,我就能够从 t1 中删除。这需要从 t1_hist table 中进行第二遍删除,因为它记录了我从 t1 中删除的内容。
简单地说,我的是:DELETE FROM t1 WHERE customer_number > 50000;
同样的错误。首先(和最后)从 t1_hist 做同样的事情,然后没问题。