UPDATE操作出現主鍵衝突錯誤,如果出現了這樣的問題,你一定會感到匪夷所思。
mysql> UPDATE `GC_Price` SET `Price` = '155.00', `OptTime` = '2013-07-01 16:12:36', `CRCode` = '0109' WHERE (PRID = 364706189);
ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'
我的GC_Price表的主鍵PRID的最大值為:437573062,而求表中也沒主鍵為'2147483647' 的記錄。
2147483647:注意,這個int的最大值,不信,你用計算機算一算。應該是表的自增主鍵達到了最大值。。。外部索引鍵關聯或觸發器等儲存代碼。。。
既然不是GC_Price表發生主鍵衝突,那隻能由其他的代碼引起。那看看觸發器吧
mysql> show triggers like '%Price%'\G;
*************************** 1. row ***************************
Trigger: t_price_changed_prid_insert
Event: INSERT
Table: GC_Price
Statement: INSERT INTO BE_PRID_Changed(PRID,Type) VALUES (NEW.PRID,1);
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Trigger: t_price_changed_prid_update
Event: UPDATE
Table: GC_Price
Statement: INSERT INTO BE_PRID_Changed(PRID,Type) VALUES (NEW.PRID,2)
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.00 sec)
查看錶BE_PRID_Changed的結構
mysql> show create table BE_PRID_Changed\G;
*************************** 1. row ***************************
Table: BE_PRID_Changed
Create Table: CREATE TABLE `BE_PRID_Changed` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`PRID` int(12) NOT NULL COMMENT '來源PRID',
`Type` tinyint(1) NOT NULL COMMENT '1 from insert 2 from update',
`CreatedTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間',
`Status` tinyint(1) DEFAULT '1' COMMENT '1待處理 2已處理 ',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2147483648 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
AUTO_INCREMENT=2147483648的值已經達到了最大,UPDATE出現主鍵衝突的“真”凶也找到了。
解決辦法,很多:
1)直接刪除該觸發器(如果沒用。。。)
2)rename該表,重新建立一個相同的空表。