sql 如果不存在则插入,存在则不操作或修改
原文鏈接:https://blog.csdn.net/weixin_40533111/article/details/84137404 作者四月天五月雨^_^,轉(zhuǎn)載請注明出處,謝謝
前言
本文介紹幾種數(shù)據(jù)庫SQL插入問題,如果存在該記錄,則不操作或者執(zhí)行更新,每種方式都有各自適應(yīng)的場景,一一舉例
目錄:
1.虛表dual 加條件 not EXISTS
2.使用replace into
3.使用ON DUPLICATE KEY UPDATE
4.從其他表獲取數(shù)據(jù)
5.設(shè)置唯一索引
正文:
1.虛表dual 加條件 not EXISTS
表現(xiàn)狀:一張新建標簽表tag,主鍵id自增,另外幾個普通字段
現(xiàn)在有個 需求: 新插入一個標簽, 要求item_key,item_value不能同時重復(fù),否則不插入
選擇: 首先排除4,接著排除3,5,因為普通列上沒有設(shè)置索引,(可以設(shè)置唯一索引在兩個列上,這樣插入重復(fù)時,會索引重復(fù)導(dǎo)致失敗,會拋出異常,如果頻繁插入重復(fù),損耗性能,不建議); 現(xiàn)有的標簽在其他表中可能存在引用,故不能使用2的replace,綜合考慮使用方式1
步驟:
使用虛表dual后跟條件 EXISTS,
eg:
insert into tag (category,item_key,item_value) select 'test1','key1','value1' from dual where NOT EXISTS (SELECT id FROM tag WHERE category='test1' and item_key='key1' and item_value='value1')
2.使用replace into
場景:如果確定存量的數(shù)據(jù)不重要,那么可以使用replace,簡單高效,類似insert into的升級版,但操作的列必須存在唯一索引(主鍵包含唯一索引),
1 在三個列上加上unique索引(根據(jù)實際列數(shù))
2.使用replace
可以看到,id為1的那條記錄被刪除,之后又插入一條新紀錄,id為1240;
3.使用ON DUPLICATE KEY UPDATE
需求:如果不存在則插入,存在則更新value鍵,進行加1(舉例用的字符串,實際生產(chǎn)中可能是int),
DUPLICATE 命令需作用在有唯一索引的的列上,如果這列索引有重復(fù)則執(zhí)行update,否則執(zhí)行insert.
4.從其他表獲取數(shù)據(jù)
這點和題目不符了,算是個批處理
INSERT INTO tag (category,item_key,item_value) SELECT category,item_key,item_value from tag_copy where id in(SELECT id from tag_copy where item_value like 'value%');5.設(shè)置唯一索引
步驟可參考第三條,此處做點補充,因為是使用索引來控制插入不重復(fù),那么有個問題,當(dāng)索引重復(fù)時程序會異常,需要cache異常,而在批處理中,如果再使用這種高頻度,性能不高的,應(yīng)通過其他方式控制.
春水碧于天,畫船聽雨眠。
總結(jié)
以上是生活随笔為你收集整理的sql 如果不存在则插入,存在则不操作或修改的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL如果不存在一个表则创建
- 下一篇: 软件开发可行性分析九个流程的理解