Mysql

執行更新查詢時復合主鍵出現重複鍵錯誤而沒有重複

  • July 28, 2017

我有一個具有以下架構的表

   CREATE TABLE `my_field_table` (
 `entity_type` varchar(128) NOT NULL DEFAULT '' ,
 `bundle` varchar(128) NOT NULL DEFAULT '',
 `deleted` tinyint(4) NOT NULL DEFAULT '0',
 `entity_id` int(10) unsigned NOT NULL,
 `language` varchar(32) NOT NULL DEFAULT '',
 PRIMARY KEY (`entity_type`,`entity_id`,`deleted`,`language`),
 KEY `entity_type` (`entity_type`),
 KEY `bundle` (`bundle`),
 KEY `deleted` (`deleted`),
 KEY `entity_id` (`entity_id`),
 KEY `language` (`language`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Data storage for field 49 (my_field)'

並且表中已經存在以下兩個條目。

+-------------------+----------+---------+-----------+----------+
|    entity_type    |  bundle  | deleted | entity_id | language |
+-------------------+----------+---------+-----------+----------+
| node              | article  |  0      | 9001      | 5555     |
| node              | article  |  0      | 9001      | abcc     |
+-------------------+----------+---------+-----------+----------+

當我執行以下更新查詢時:

UPDATE `my_field_table` SET language='9002' WHERE entity_id = 9001;

我收到錯誤消息Error Code: 1062. Duplicate entry ’node-9001-0-9002’ for key ‘PRIMARY’

但是,我沒有看到已經存在的欄位值的這種組合,這讓我對重複輸入錯誤感到困惑。通常我至少有一個作為主鍵的自動增量鍵,但這個表沒有一個,而且我缺乏數據庫經驗也對我沒有幫助。

我嘗試搜尋類似的問題,但建議的解決方案是檢查現有條目或創建具有相同結構的新表並模擬它以檢查我的表是否已損壞。前者不會獲取任何結果,而我能夠用後者重現相同的錯誤。

對此錯誤原因的一些見解將不勝感激。

您在以下欄位上有一個主鍵,這意味著它們在組合時必須是唯一的。

主鍵 ( entity_type, entity_id, deleted, language)

目前,它們是唯一的,因為您在表中有兩個語言條目。更新後,語言的兩行將具有相同的條目,並且這些行將不再是唯一的。

您的UPDATE陳述將使您顯示的兩行相同。那時,它們將具有相同的主鍵,因此您無法成功更改它們。

引用自:https://dba.stackexchange.com/questions/182111