mysql – 何时INSERT … ON DUPLICATE失败?
作者:互联网
由于约束错误,我正在对INSERT … ON DUPLICATE KEY语句进行故障排除,但我不可逆转地编辑了有问题的行,我不再收到错误.我很确定我编辑了request_path或target_path.某些区域已存在的某些值:
store_id | id_path | is_system
6 | category/494 | 1
查询是
INSERT INTO `core_url_rewrite` (`store_id`,`category_id`,`product_id`,`id_path`,`request_path`,`target_path`,`is_system`)
VALUES (6, 494, NULL, 'category/494', 'lessons/teacher-s-planning-calendar/n-a', 'catalog/category/view/id/494', 1)
ON DUPLICATE KEY UPDATE
`store_id` = VALUES(`store_id`),
`category_id` = VALUES(`category_id`),
`product_id` = VALUES(`product_id`),
`id_path` = VALUES(`id_path`),
`request_path` = VALUES(`request_path`),
`target_path` = VALUES(`target_path`),
`is_system` = VALUES(`is_system`)
错误是
Integrity constraint violation: 1062 Duplicate entry 'category/494-1-6'
for key 'UNQ_CORE_URL_REWRITE_ID_PATH_IS_SYSTEM_STORE_ID'
这张桌子上有两个独特的钥匙.
UNIQUE KEY `UNQ_CORE_URL_REWRITE_REQUEST_PATH_STORE_ID` (`request_path`,`store_id`),
UNIQUE KEY `UNQ_CORE_URL_REWRITE_ID_PATH_IS_SYSTEM_STORE_ID` (`id_path`,`is_system`,`store_id`)
在行上意外手动更改某些值后,我不再遇到此约束错误.什么会导致我的查询提示该约束错误?
解决方法:
如果修复第一个唯一性约束(通过更新冲突行而不是插入新行)会导致第二个失败,则会发生这种情况.
例如,假设您的表已经包含以下行:
(6, 494, NULL, 'category/123', 'lessons/teacher-s-planning-calendar/n-a', 'catalog/category/view/id/123', 1),
(6, 494, NULL, 'category/494', 'lessons/foobar/whatever', 'catalog/category/view/id/494', 1);
然后尝试插入新行:
(6, 494, NULL, 'category/494', 'lessons/teacher-s-planning-calendar/n-a', 'catalog/category/view/id/494', 1)
将导致第一个约束失败(因为表中已存在request_path =’lessons / teacher-s-planning-calendar / na’和store_id = 6的行),因此ON DUPLICATE KEY UPDATE子句将导致冲突要更新的行.但是这会导致它违反第二个约束,因为表中已经存在另一行id_path =’category / 494′,is_system = 1和store_id = 6.
Here’s a simple example on SQLize demonstrating this behavior.
实际上,what really happens是,如果具有ON DUPLICATE KEY UPDATE的INSERT语句违反多个唯一性约束,MySQL将尝试将更新应用于所有冲突的行.对于这样的更新,将所有列设置为固定值,这几乎可以保证导致进一步的约束违规,因为它有效地尝试使表中的两个不同的行相同.
如链接文档所述:
In general, you should try to avoid using an
ON DUPLICATE KEY UPDATE
clause on tables with multiple unique indexes.
标签:mysql,constraints,unique-constraint 来源: https://codeday.me/bug/20190609/1204885.html