在MySQL數據庫中,有哪些方法可以避免重複的插入數據?

兩年半丶


最常見的方式就是為字段設置主鍵或唯一索引,當插入重複數據時,拋出錯誤,程序終止,但這會給後續處理帶來麻煩,因此需要對插入語句做特殊處理,儘量避開或忽略異常,下面我簡單介紹一下,感興趣的朋友可以嘗試一下:

這裡為了方便演示,我新建了一個user測試表,主要有id,username,sex,address這4個字段,其中主鍵為id(自增),同時對username字段設置了唯一索引:

01

insert ignore into

即插入數據時,如果數據存在,則忽略此次插入,前提條件是插入的數據字段設置了主鍵或唯一索引,測試SQL語句如下,當插入本條數據時,MySQL數據庫會首先檢索已有數據(也就是idx_username索引),如果存在,則忽略本次插入,如果不存在,則正常插入數據:

02

on duplicate key update

即插入數據時,如果數據存在,則執行更新操作,前提條件同上,也是插入的數據字段設置了主鍵或唯一索引,測試SQL語句如下,當插入本條記錄時,MySQL數據庫會首先檢索已有數據(idx_username索引),如果存在,則執行update更新操作,如果不存在,則直接插入:

03

replace into

即插入數據時,如果數據存在,則刪除再插入,前提條件同上,插入的數據字段需要設置主鍵或唯一索引,測試SQL語句如下,當插入本條記錄時,MySQL數據庫會首先檢索已有數據(idx_username索引),如果存在,則先刪除舊數據,然後再插入,如果不存在,則直接插入:

04

insert if not exists

insert into … select … where not exist ... ,這種方式適合於插入的數據字段沒有設置主鍵或唯一索引,當插入一條數據時,首先判斷MySQL數據庫中是否存在這條數據,如果不存在,則正常插入,如果存在,則忽略:

目前,就分享這4種MySQL處理重複數據的方式吧,前3種方式適合字段設置了主鍵或唯一索引,最後一種方式則沒有此限制,只要你熟悉一下使用過程,很快就能掌握的,網上也有相關資料和教程,介紹的非常詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。


小小猿愛嘻嘻


簡要說下三者的區別:

insert into 最普遍的插入,如果表中存在主鍵相同的數據,執行會報錯。

replace into 如果表中存在主鍵相同的數據則根據主鍵修改當前主鍵的數據,反之則插入(存在就刪除然後插入,反之直接插入)

insert ignore 如果表中存在主鍵相同的數據不在插入該條數據,反之則插入(存在則忽略,反之插入)

測試:

1.新增一張測試表 並預置數據

CREATE TABLE `insert_text` ( `id` varchar(50) NOT NULL, `value` varchar(50) DEFAULT NULL , `memo` varchar(50) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `insert_text` (`id`, `value`, `memo`) VALUES ("1\

我的新視界


MySQL數據庫中避免重複數據插入

在數據庫中已經存在重複數據 ,並且數據量很大 的時候,在修改sql語句在插入時 避免重複插入,可以有以下方法。

設置唯一索引

使用ignore或者REPLACE INTO 或者ON DUPLICATE KEY UPDATE

on duplicate key update

如果數據存在會觸發更新操作 執行後面語句的update

INSERT INTO tb_table(a,b,c) VALUE('1','bbb','ccc') ON DUPLICATE KEY UPDATE b= 'bbb',c='ccc'

ON DUPLICATE KEY UPDATE 之後的語句不是條件判斷 條件的判斷會根據你的唯一索引來判斷觸發update之後會執行 UPDATE之後的語句進行更新如果update之後寫的是條件判斷的話 就會出現只能插入無法更新的操作

replace into

如果數據存在就刪除再插入

REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);

insert ignore into

如果插入時 數據存在則忽略此次插入數據

INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);

沒有設置唯一索引

但是當你的數據庫中數據存在重複,重複字段並沒有設置唯一索引或者主鍵的時候,

上面的方法是無法使用的,這種情況可以使用

insert if not exists

insert if not existsINSERT INTO TABLE (field1, field2, fieldn) SELECT 'field1','field2','fieldn'FROM 表 WHERENOT EXISTS (SELECT * FROM 表名 WHERE 字段= ?)

月下聽風雨


數據重複需要根據不通的業務不通的方法來解決,下面是一些常規的解決方法:

1、根據業務,加唯一約束。例如訂單表,你可以對流水號或者訂單號增加unique。

2、根據業務,如果不能加唯一約束,通過加鎖實現。例如mysql的get_lock和release_lock可以去顯示。當然自己創建一個鎖表也是可以的,將整個請求鎖住。

3、如果mysql性能不好,就使用一些緩存系統去實現,例如redis或者Memcache。

4、異步隊列


影客空間


數據庫的唯一性是很多業務場景需要考慮的事情,我覺得可以有以下幾種方案:

1.數據表建立唯一索引。唯一索引能在數據庫層面確保數據不重發,重發insert的數據會返回報錯。

2.數據insert前先查詢是否存在。數據校驗是必要的,不能什麼數據都往數據庫裡操作,判斷存在的數據執行update即可。

3.如果是可以直接覆蓋的語句,又不想預先查詢,可以使用replace關鍵字。這個關鍵字比較少用,方法原理:將相同的字段數據直接先刪掉,再重新添加,成功之後顯示操作條數的是刪除的條數加上新添加的條數。

4.有時候後端語言層面會避免不了的併發操作,例如大量線程的情況下。可以以先寫入redis,再寫入mysql




環球新觀察


你可以用insert if not exists寫sql語句,例如:

INSERT INTO TABLE (field1, field2, fieldn) SELECT 'field1','field2','fieldn'

FROM

表名

WHERE

NOT EXISTS (

SELECT

*

FROM

表名

WHERE

字段= ?

)


php自學中心


首先數據重複定義需要明確,是某個字段還是多個字段重複。

重複定義的不同,使用的方法不同。

譬如

id不可重複,使用索引即可。保存數據會失敗,進行異常回滾。

字段較多的,索引過多性能受影響,可以通過代碼邏輯判斷,先判斷在保存。

如果在分佈式下保存,此時還需要引入分佈式鎖,保證每次僅一端操作!分佈式下還會引入其他問題,數據一致性問題,這些都是需要考慮的。

具體還是取決業務需求、利益權衡!


前端首席體驗師


試著站在生活角度來回答一下這個數據庫問題

1.人不能兩次踏入一條河流,是因為時間,河流都隨時發生了變化。

2.世界上沒有兩片完全相同的葉子,是因為造物主賦予了生命。

3.一個人不允許擁有兩個身份證,是因為公安機關在管理。

對於數據庫來說,是否有唯一性索引,是否有寫入前判斷機制,是否重複數據約定規則足夠清晰,都是影響插入重複數據的關鍵。

生活中的規律,與此相似。


yicaigou


方法一:使用ignore關鍵字

如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用:

複製代碼 代碼如下:

INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protected]', '99999', '9999');

這樣當有重複記錄就會忽略,執行後返回數字0


分享到:


相關文章: