有的時候會需要寫一段insert的sql,如果主鍵存在,則update;如果主鍵不存在,則insert。Mysql中提供了這樣的用法:
ON DUPLICATE KEY UPDATE
。下面就看看它是如何使用的吧!
首先數據庫的原始數據如下:
a b c 1 b1 c1 2 b2 c2 3 b3 c3
此時如果執行下面的sql就會報錯
INSERT INTO test VALUES(1,'b4','c4');
報錯信息如下,提示無法重復插入:
1 queries executed, 0 success, 1 errors, 0 warnings
查詢:insert into test values(1,'b4','c4') 錯誤代碼: 1062 Duplicate entry '1' for key 'PRIMARY' 執行耗時 : 0 sec 傳送時間 : 0 sec 總耗時 : 0.008 sec
這時,就可以使用ON DUPLICATE KEY UPDATE
,它的意思是先執行前面的Insert,如果主鍵重復,則執行后面的UPDATE
INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c);
可以把上面的SQL簡單的理解為:
select count(1) from test where a=1; if count(1) > 0 UPDATE test SET b='xxx',c='xxx' WHERE a=1;
執行完,可以看到有兩行收到影響(至於為什么兩行收到影響,就得研究底層的實現了,可以參考官方文檔):
1 queries executed, 1 success, 0 errors, 0 warnings
查詢:INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c) 共 2 行受到影響 執行耗時 : 0.023 sec 傳送時間 : 0 sec 總耗時 : 0.023 sec
執行完,數據就變成下面的樣子了:
a b c 1 b4 c4 2 b2 c2 3 b3 c3
原作者:xingoo
Github: https://github.com/xinghalo
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
Github: https://github.com/xinghalo
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。