-
1 # 環球新觀察
-
2 # 我的新視界
簡要說下三者的區別:
insert 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", "2", "3");2.檢測replace into執行效果
(1)執行語句(該語句的ID與預置資料的ID相同):
REPLACE INTO `insert_text` (`id`, `value`, `memo`) VALUES ("1", "replace", "replace");執行結果:
(注意:這裡返回的受影響行數為2,所以在統計插入資料成功的條數需注意下)
(2)執行語句(該語句的ID與預置資料的ID不同):
REPLACE INTO `insert_text` (`id`, `value`, `memo`) VALUES ("2", "replace", "replace");執行結果:
在這裡因為主鍵不同,可以理解為執行了insert into
3.檢測insert ignore執行效果:
(1)執行語句(該語句的ID與預置資料的ID相同):
INSERT IGNORE `insert_text` (`id`, `value`, `memo`) VALUES ("1", "ignore", "ignore");資料未發生改變
(2)執行語句(該語句的ID與預置資料的ID不同):
INSERT IGNORE `insert_text` (`id`, `value`, `memo`) VALUES ("2", "ignore", "ignore");在這裡因為主鍵不同,可以理解為執行了insert into
好了,測試完成,需要根據不同的場景選擇對應的插入方式----------------fillt
-
3 # 軟體測試開發技術棧
在MySQL中大概有四種方式可以防止資料的重複插入,我們以如下user_basic_infor表為例,分別簡單介紹一下這幾種方式,user_basic_infor的建表SQL語句如下:
insert ignore into如上,在 user_basic_infor表中使用主鍵索引(PRIMARY KEY)以及唯一索引(UNIQUE KEY)確保資料具的唯一性,為避免重複插入記錄可以使用 insert ignore into 語法,如下:
當使用 ignore 插入資料時,如果出現錯誤,如重複記錄,將不返回錯誤,僅以警告形式返回。因此使用 ignore時,請確保SQL語句本身沒有問題,否則也將會被忽略掉。
on duplicate key update同樣,在user_basic_infor表中使用主鍵索引(PRIMARY KEY)以及唯一索引(UNIQUE KEY)確保資料具的唯一性,為避免重複插入記錄也可以使用 on duplicate key update 語法,如下:
如果在 insert 語句末尾指定了on duplicate key update ……,並且插入行後會導致在主鍵索引(PRIMARY KEY)或者唯一索引(UNIQUE KEY)中出現重複值時,則在出現重複值的行執行
update ,如果不會導致唯一值列重複的問題,則插入該新行。
replace into同樣,在user_basic_infor表中使用主鍵索引(PRIMARY KEY)以及唯一索引(UNIQUE KEY)確保資料具的唯一性,為避免重複插入記錄也可以使用replace into 語法,如下:
replace 嘗試把新行插入到表中,當如果插入資料的主鍵索引(PRIMARY KEY)以及唯一索引(UNIQUE KEY)出現重複,導致報錯而造成插入失敗時,會先從表中刪除原有涉及到重複的行,然後再次嘗試把新行插入到表中,這種方法就是無論原來有沒有相同的記錄,都會先刪除再執行插入。
insert … select … where not exist ……除此之外,在 MySQL 中,插入一條記錄,我們可以先檢查這條記錄是否已經存在,當記錄不存在時再執行插入操作,這樣可以不只透過主鍵索引(PRIMARY KEY)或者唯一索引(UNIQUE KEY)來判斷,也可透過其它條件,如下:
-
4 # 載笑風月
方法一:使用ignore關鍵字
如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用:
複製程式碼 程式碼如下:
INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ("[email protected]", "99999", "9999");
這樣當有重複記錄就會忽略,執行後返回數字0
-
5 # 小小猿愛嘻嘻
最常見的方式就是為欄位設定主鍵或唯一索引,當插入重複資料時,丟擲錯誤,程式終止,但這會給後續處理帶來麻煩,因此需要對插入語句做特殊處理,儘量避開或忽略異常,下面我簡單介紹一下,感興趣的朋友可以嘗試一下:
這裡為了方便演示,我新建了一個user測試表,主要有id,username,sex,address這4個欄位,其中主鍵為id(自增),同時對username欄位設定了唯一索引:
01insert ignore into即插入資料時,如果資料存在,則忽略此次插入,前提條件是插入的資料欄位設定了主鍵或唯一索引,測試SQL語句如下,當插入本條資料時,MySQL資料庫會首先檢索已有資料(也就是idx_username索引),如果存在,則忽略本次插入,如果不存在,則正常插入資料:
02on duplicate key update即插入資料時,如果資料存在,則執行更新操作,前提條件同上,也是插入的資料欄位設定了主鍵或唯一索引,測試SQL語句如下,當插入本條記錄時,MySQL資料庫會首先檢索已有資料(idx_username索引),如果存在,則執行update更新操作,如果不存在,則直接插入:
03replace into即插入資料時,如果資料存在,則刪除再插入,前提條件同上,插入的資料欄位需要設定主鍵或唯一索引,測試SQL語句如下,當插入本條記錄時,MySQL資料庫會首先檢索已有資料(idx_username索引),如果存在,則先刪除舊資料,然後再插入,如果不存在,則直接插入:
04insert if not exists即insert into … select … where not exist ... ,這種方式適合於插入的資料欄位沒有設定主鍵或唯一索引,當插入一條資料時,首先判斷MySQL資料庫中是否存在這條資料,如果不存在,則正常插入,如果存在,則忽略:
目前,就分享這4種MySQL處理重複資料的方式吧,前3種方式適合欄位設定了主鍵或唯一索引,最後一種方式則沒有此限制,只要你熟悉一下使用過程,很快就能掌握的,網上也有相關資料和教程,介紹的非常詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。
回覆列表
資料庫的唯一性是很多業務場景需要考慮的事情,我覺得可以有以下幾種方案:
1.資料表建立唯一索引。唯一索引能在資料庫層面確保資料不重發,重發insert的資料會返回報錯。
2.資料insert前先查詢是否存在。資料校驗是必要的,不能什麼資料都往資料庫裡操作,判斷存在的資料執行update即可。
4.有時候後端語言層面會避免不了的併發操作,例如大量執行緒的情況下。可以以先寫入redis,再寫入mysql