MySQL 1301錯(cuò)誤是指在執(zhí)行Insert操作時(shí),插入的信息與數(shù)據(jù)庫(kù)中已有的記錄發(fā)生了重復(fù),導(dǎo)致插入失敗。常見(jiàn)的情況是在使用唯一約束的列插入重復(fù)的值,如下面的例子:
CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL, PRIMARY KEY (id), UNIQUE INDEX name_unique (name) ); INSERT INTO test (name) VALUES ('alice'); INSERT INTO test (name) VALUES ('bob'); INSERT INTO test (name) VALUES ('alice'); --重復(fù)插入
執(zhí)行最后一條SQL語(yǔ)句時(shí),便會(huì)出現(xiàn)MySQL 1301錯(cuò)誤。這時(shí)可以通過(guò)查詢(xún)錯(cuò)誤碼和錯(cuò)誤信息來(lái)確定具體的錯(cuò)誤原因。
mysql>SELECT @@ERROR_CODE; +--------------+ | @@ERROR_CODE | +--------------+ | 1301 | +--------------+ mysql>SELECT @@ERROR_MESSAGE; +---------------------------------+ | @@ERROR_MESSAGE | +---------------------------------+ | Duplicate entry 'alice' for key 'name_unique' | +---------------------------------+
從以上輸出可以看出,錯(cuò)誤原因是因?yàn)橄騨ame_unique唯一索引列插入了重復(fù)的值。要解決這個(gè)問(wèn)題,可以通過(guò)在Insert語(yǔ)句中使用IGNORE關(guān)鍵字來(lái)忽略重復(fù)值,或者使用ON DUPLICATE KEY UPDATE關(guān)鍵字來(lái)更新已有記錄。例如:
-- 使用IGNORE關(guān)鍵字 INSERT IGNORE INTO test (name) VALUES ('alice'); -- 使用ON DUPLICATE KEY UPDATE關(guān)鍵字 INSERT INTO test (name) VALUES ('alice') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
總之,在使用唯一列約束、唯一索引或者主鍵約束時(shí),要注意值的唯一性,防止出現(xiàn)MySQL 1301錯(cuò)誤。