ON DUPLICATE KEY UPDATE 用法与说明
ON DUPLICATE KEY UPDATE作用
先聲明一點(diǎn),ON DUPLICATE KEY UPDATE為Mysql特有語法,這是個坑
語句的作用,當(dāng)insert的時候如果對應(yīng)的記錄已經(jīng)存在,則執(zhí)行Update
用法
什么意思?舉個例子:
user_admin_t表中有一條數(shù)據(jù)如下
表中的主鍵為id,現(xiàn)要插入一條數(shù)據(jù),id為‘1’,password為‘第一次插入的密碼’,一般寫法為:
執(zhí)行后刷新表數(shù)據(jù),我們來看表中內(nèi)容
此時表中數(shù)據(jù)增加了一條主鍵’_id’為‘1’,‘password’為‘第一次插入的密碼’的記錄,當(dāng)我們再次執(zhí)行上述插入語句時,會發(fā)生什么呢?
[SQL]INSERT INTO user_admin_t (_id,password) VALUES ('1','第一次插入的密碼') [Err] 1062 - Duplicate entry '1' for key 'PRIMARY'Mysql告訴我們,我們的主鍵沖突了,看到這里我們是不是可以改變一下思路,當(dāng)插入已存在主鍵的記錄時,將插入操作變?yōu)樾薷?#xff1a;
– 在原sql后面增加 ON DUPLICATE KEY UPDATE
我們再一次執(zhí)行:
[SQL]INSERT INTO user_admin_t (_id,password) VALUES ('1','第一次插入的密碼') ON DUPLICATE KEY UPDATE _id = 'UpId', password = 'upPassword'; 受影響的行: 2 時間: 0.131s可以看到 受影響的行為2,這是因為將原有的記錄修改了,而不是執(zhí)行插入,看一下表中數(shù)據(jù):
原本‘id’為‘1’的記錄,改為了‘UpId’,‘password’也變?yōu)榱恕畊pPassword’,很好的解決了重復(fù)插入問題
擴(kuò)展
當(dāng)插入多條數(shù)據(jù),其中不只有表中已存在的,還有需要新插入的數(shù)據(jù),Mysql會如何執(zhí)行呢?會不會報錯呢?
其實(shí)Mysql遠(yuǎn)比我們想象的強(qiáng)大,他會智能的選擇更新還是插入,我們嘗試一下:
運(yùn)行sql
[SQL]INSERT INTO user_admin_t (_id,password) VALUES ('1','第一次插入的密碼') , ('2','第二條記錄') ON DUPLICATE KEY UPDATE _id = 'UpId', password = 'upPassword'; 受影響的行: 3 時間: 0.045sMysql執(zhí)行了一次修改,一次插入,表中數(shù)據(jù)為:
VALUES修改
那么問題又來了,有人會說我ON DUPLICATE KEY UPDATE 后面跟的是固定的值,如果我想要分別給不同的記錄插入不同的值怎么辦呢?
方法之一可以將后面的修改條件改為VALUES(password),動態(tài)的傳入要修改的值,執(zhí)行以下:
[SQL]INSERT INTO user_admin_t (_id,password) VALUES ('1','多條插入1') , ('UpId','多條插入2') ON DUPLICATE KEY UPDATE password = VALUES(password); 受影響的行: 4 時間: 0.187s成功的修改了兩條記錄,刷新一下表
我們成功的為不同id的password修改成了不同的值
總結(jié)
其實(shí)修改的方法有很多種,包括SET或用REPLACE,連事務(wù)都省的做,ON DUPLICATE KEY UPDATE能夠讓我們便捷的完成重復(fù)插入的開發(fā)需求,但它是Mysql的特有語法,使用時應(yīng)多注意主鍵和插入值是否是我們想要插入或修改的key、Value。
總結(jié)
以上是生活随笔為你收集整理的ON DUPLICATE KEY UPDATE 用法与说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUnit中测试异常抛出的方法
- 下一篇: 《MySQL实战45讲》实践篇 9-15