Mysql執行insert時,不插入重複資料

語言: CN / TW / HK

theme: smartblue highlight: a11y-dark


今天遇到一個問題:通過sql語句直接實現重複資料不插入,而不用藉助邏輯程式碼進行判斷。

通過查詢目前有三種方法可以實現。

一、insert ignore into

前提條件:插入的屬性列中包含主鍵或者唯一索引。

用法:和insert into用法一致,插入時需要指定屬性列,否則預設全部屬性列值。當根據主鍵或唯一索引判定重複時,直接忽略該條資料,執行下一條。

例子: 給表設定了主鍵和唯一索引(id:主鍵, serial: 設定了唯一索引)

image.png

  • 主鍵重複

image.png

因為ID為6的資料已存在,所以受影響行數為0,也就意味著不插入。

  • 唯一索引重複

image.png

插入了兩天serial一樣的資料資訊,可以看到受影響行數為1,也就是說在在插入第二條資料的時候重複直接忽視。

二、replace into

前提條件:插入的屬性列中包含主鍵或者唯一索引。

用法:和insert into用法一致,插入時需要指定屬性列,否則預設全部屬性列值。當表中存在重複資料,則先刪除此行資料,然後插入新的資料,相當於 delete + insert

例子:

  • 主鍵重複

image.png replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體12","40110992","陶瓷壓力感測器芯體","CPS1184-5bar")

ID重複,修改了type屬性列的資料,執行之後再次檢視資料庫中的資料,發現數據已變更。

image.png

  • 唯一索引重複

image.png replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體","40110992","陶瓷壓力感測器芯體","CPS1184-5bar")

ID不同,serial相同,執行sql之後,再次檢視資料庫中的資料,發現ID已變更。

image.png

三、insert into ... on duplicate key update...

前提條件:插入的屬性列中包含主鍵或者唯一索引。

用法:該資料庫可以以on duplicate key為界限,分為兩部分來看。當資料重複時,執行後面的update部分,當資料不存在時,執行insert.

例子:

  • 主鍵重複

image.png

  • 唯一索引重複

image.png