MySQL批量插入唯一索引沖突的幾種避免辦法
我們在進(jìn)行大批量的數(shù)據(jù)插入時(shí),遇到唯一索引沖突是經(jīng)常的事,報(bào)錯(cuò)如下:
java.util.concurrent.ExecutionException: org.springframework.dao.DuplicateKeyException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1122-zhangsan' for key 'idx_no_name'
在MySQL中有4種方法可以避免唯一索引沖突
(一)導(dǎo)入差異數(shù)據(jù),忽略重復(fù)數(shù)據(jù),IGNORE INTO的使用
(二)導(dǎo)入并覆蓋重復(fù)數(shù)據(jù),REPLACE INTO 的使用
(三)導(dǎo)入保留重復(fù)數(shù)據(jù)未指定字段,INSERT INTO ON DUPLICATE KEY UPDATE 的使用
表 test1
1、insert ignore into
INSERTIGNORE語句可以在插入數(shù)據(jù)時(shí)忽略唯一索引沖突的錯(cuò)誤,而不會中斷插入過程。
如果插入的數(shù)據(jù)存在唯一索引沖突,那么MySQL將忽略該行的插入操作,繼續(xù)插入下—行數(shù)據(jù)。
INSERT IGNORE INTO table_name (column1, column2, ...) VALUES (valuel, value2, ...),...
2、replace into
REPLACE語句可以用于插入新行或替換已存在的行。
如果存在primary or unique相同的記錄,則先刪除掉。再插入新記錄
如果插入的數(shù)據(jù)存在唯一索引沖突,那么MySQL將刪除已存在的行,并插入新行。
這種方法就是不管原來有沒有相同的記錄,都會先刪除掉然后再插入。這意味著插入操作總是成功的,但可能導(dǎo)致數(shù)據(jù)丟失
REPLACE INTO table_name (columnl, column2, ...) VALUES (valuel, value2, ...),...
3、on duplicate key update
當(dāng)primary或者unique重復(fù)時(shí),則執(zhí)行update語句,如update后為無用語句,
如id=id,則同1功能相同,但錯(cuò)誤不會被忽略掉。例如,為了實(shí)現(xiàn)name重復(fù)的數(shù)據(jù)插入不報(bào)錯(cuò),可使用一下語句:
INTO table_name (columnl, column2, ...) VALUES (valuel, value2, ...),... ON duplicate KEY UPDATE id = id
這種方法有個(gè)前提條件,就是,需要插入的約束,需要是主鍵或者唯一約束。
4、insert … select … where not exist
根據(jù)select的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件。例如:
INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)
這種方法貌似寫這很繁瑣
INSERT INTO order (orderId ) VALUES SELECT '500002' FROM DUAL WHERE NOT EXISTS ( SELECT * FROM order WHERE orderId='500002' )
到此這篇關(guān)于MySQL批量插入唯一索引沖突的幾種避免辦法的文章就介紹到這了,更多相關(guān)MySQL避免唯一索引沖突內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)庫中的TRUNCATE?TABLE命令詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中TRUNCATE?TABLE命令的相關(guān)資料,Truncate Table“清空表”的意思,它對數(shù)據(jù)庫中的表進(jìn)行清空操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05MySQL忘記root密碼以及遠(yuǎn)程無法連接的解決方法
這篇文章主要介紹了MySQL忘記root密碼以及遠(yuǎn)程無法連接問題的解決方法,文中有詳細(xì)的代碼示例來解決這些辦法,需要的朋友可以參考下2023-06-06深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵
這篇文章主要介紹了深入分析mysql為什么不推薦使用uuid或者雪花id作為主鍵,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09MySQL server has gone away錯(cuò)誤提示解決方法
今天遇到類似的情景,MySQL只是冷冷的說:MySQL server has gone away。2008-11-11MySQL運(yùn)維實(shí)戰(zhàn)使用RPM進(jìn)行安裝部署
這篇文章主要為大家介紹了MySQL運(yùn)維實(shí)戰(zhàn)使用RPM進(jìn)行安裝部署實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12MySQL MHA 運(yùn)行狀態(tài)監(jiān)控介紹
這篇文章主要介紹MySQL MHA 運(yùn)行狀態(tài)監(jiān)控,MHA(Master HA)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復(fù)制架構(gòu)提供了 automating master failover 功能,想具體了解的小伙伴可以和小編一起學(xué)習(xí)下面文章內(nèi)容2021-10-10MySQL基礎(chǔ)入門之Case語句用法實(shí)例
case語句是mysql中的一個(gè)條件語句,可以在字段中使用case語句進(jìn)行復(fù)雜的篩選以及構(gòu)造新的字段,下面這篇文章主要給大家介紹了關(guān)于MySQL基礎(chǔ)入門之Case語句用法的相關(guān)資料,需要的朋友可以參考下2022-08-08