Mysql執行insert時,不插入重複資料
theme: smartblue highlight: a11y-dark
今天遇到一個問題:通過sql語句直接實現重複資料不插入,而不用藉助邏輯程式碼進行判斷。
通過查詢目前有三種方法可以實現。
一、insert ignore into
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:和insert into用法一致,插入時需要指定屬性列,否則預設全部屬性列值。當根據主鍵或唯一索引判定重複時,直接忽略該條資料,執行下一條。
例子: 給表設定了主鍵和唯一索引(id:主鍵, serial: 設定了唯一索引)
- 主鍵重複
因為ID為6的資料已存在,所以受影響行數為0,也就意味著不插入。
- 唯一索引重複
插入了兩天serial一樣的資料資訊,可以看到受影響行數為1,也就是說在在插入第二條資料的時候重複直接忽視。
二、replace into
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:和insert into用法一致,插入時需要指定屬性列,否則預設全部屬性列值。當表中存在重複資料,則先刪除此行資料,然後插入新的資料,相當於 delete + insert
例子:
- 主鍵重複
replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體12","40110992","陶瓷壓力感測器芯體","CPS1184-5bar")
ID重複,修改了type屬性列的資料,執行之後再次檢視資料庫中的資料,發現數據已變更。
- 唯一索引重複
replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體","40110992","陶瓷壓力感測器芯體","CPS1184-5bar")
ID不同,serial相同,執行sql之後,再次檢視資料庫中的資料,發現ID已變更。
三、insert into ... on duplicate key update...
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:該資料庫可以以on duplicate key為界限,分為兩部分來看。當資料重複時,執行後面的update部分,當資料不存在時,執行insert.
例子:
- 主鍵重複
- 唯一索引重複