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


小小猿愛嘻嘻


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 字段= ?)

月下聽風雨


方法一:使用ignore關鍵字

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

複製代碼 代碼如下:

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

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


分享到:


相關文章: