今天遇到一個(gè)問題:通過sql語句直接實(shí)現(xiàn)重復(fù)數(shù)據(jù)不插入,而不用借助邏輯代碼進(jìn)行判斷。
通過查詢目前有三種方法可以實(shí)現(xiàn)。
一、insert ignore into
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:和insert into用法一致,插入時(shí)需要指定屬性列,否則默認(rèn)全部屬性列值。當(dāng)根據(jù)主鍵或唯一索引判定重復(fù)時(shí),直接忽略該條數(shù)據(jù),執(zhí)行下一條。
例子: 給表設(shè)置了主鍵和唯一索引(id:主鍵, serial: 設(shè)置了唯一索引)
代碼解讀復(fù)制代碼主鍵重復(fù)
因?yàn)镮D為6的數(shù)據(jù)已存在,所以受影響行數(shù)為0,也就意味著不插入。
代碼解讀復(fù)制代碼唯一索引重復(fù)
插入了兩天serial一樣的數(shù)據(jù)信息,可以看到受影響行數(shù)為1,也就是說在在插入第二條數(shù)據(jù)的時(shí)候重復(fù)直接忽視。
二、replace into
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:和insert into用法一致,插入時(shí)需要指定屬性列,否則默認(rèn)全部屬性列值。當(dāng)表中存在重復(fù)數(shù)據(jù),則先刪除此行數(shù)據(jù),然后插入新的數(shù)據(jù),相當(dāng)于 delete + insert
例子:
主鍵重復(fù)
replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體12","40110992","陶瓷壓力傳感器芯體","CPS1184-5bar")
ID重復(fù),修改了type屬性列的數(shù)據(jù),執(zhí)行之后再次查看數(shù)據(jù)庫中的數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)已變更。
唯一索引重復(fù)
replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯體","40110992","陶瓷壓力傳感器芯體","CPS1184-5bar")
ID不同,serial相同,執(zhí)行sql之后,再次查看數(shù)據(jù)庫中的數(shù)據(jù),發(fā)現(xiàn)ID已變更。
三、insert into ... on duplicate key update...
前提條件:插入的屬性列中包含主鍵或者唯一索引。
用法:該數(shù)據(jù)庫可以以on duplicate key為界限,分為兩部分來看。當(dāng)數(shù)據(jù)重復(fù)時(shí),執(zhí)行后面的update部分,當(dāng)數(shù)據(jù)不存在時(shí),執(zhí)行insert.
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)