数据库
首页 > 数据库> > mysql – 何时INSERT … ON DUPLICATE失败?

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