在MySQL數(shù)據(jù)庫中,每個表都會有一個主鍵(primary key)來唯一標(biāo)識每一行數(shù)據(jù)。
然而,在插入數(shù)據(jù)的過程中,有可能會出現(xiàn)主鍵沖突,即要插入的數(shù)據(jù)已經(jīng)存在相同主鍵的記錄。
當(dāng)出現(xiàn)主鍵沖突時,MySQL會根據(jù)表的設(shè)置,采取不同的處理方式。
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `users` (`id`, `username`, `password`) VALUES (1, 'Alice', '123456'), (2, 'Bob', '111222'), (3, 'Charlie', 'hard2guess'); -- 主鍵沖突的場景 INSERT INTO `users` (`id`, `username`, `password`) VALUES (3, 'David', 'easy2guess');
一種常見的處理方式是忽略沖突的插入,并產(chǎn)生一個警告信息。可以通過設(shè)置IGNORE
關(guān)鍵字實現(xiàn):
-- 忽略主鍵沖突,產(chǎn)生警告信息 INSERT IGNORE INTO `users` (`id`, `username`, `password`) VALUES (3, 'David', 'easy2guess');
在這種情況下,MySQL將繼續(xù)執(zhí)行插入操作,但不會創(chuàng)建新的記錄,也不會更新任何數(shù)據(jù)。
另一種處理方式是替換已有的記錄。可以通過設(shè)置REPLACE
關(guān)鍵字實現(xiàn):
-- 替換已有的記錄 REPLACE INTO `users` (`id`, `username`, `password`) VALUES (3, 'David', 'easy2guess');
在這種情況下,MySQL將刪除原有的記錄,并將新的記錄插入到表中。
需要注意的是,如果表中有其他的相關(guān)記錄,使用REPLACE
關(guān)鍵字可能會導(dǎo)致表的數(shù)據(jù)出現(xiàn)異常。因此,建議謹(jǐn)慎使用這種方式。