ON DUPLICATE KEY UPDATE 用法與說明

ON DUPLICATE KEY UPDATE作用

先聲明一點,ON DUPLICATE KEY UPDATE爲Mysql特有語法,這是個坑 
語句的作用,當insert已經存在的記錄時,執行Update

用法

什麼意思?舉個例子: 
user_admin_t表中有一條數據如下

表中的主鍵爲id,現要插入一條數據,id爲‘1’,password爲‘第一次插入的密碼’,正常寫法爲:

INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密碼') 
  • 1
  • 2

執行後刷新表數據,我們來看錶中內容

執行insert後

此時表中數據增加了一條主鍵’_id’爲‘1’,‘password’爲‘第一次插入的密碼’的記錄,當我們再次執行插入語句時,會發生什麼呢?

-- 執行
INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密碼') 
  • 1
  • 2
  • 3
[SQL]INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密碼') 

[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
  • 1
  • 2
  • 3
  • 4
  • 5

Mysql告訴我們,我們的主鍵衝突了,看到這裏我們是不是可以改變一下思路,當插入已存在主鍵的記錄時,將插入操作變爲修改:

-- 在原sql後面增加 ON DUPLICATE KEY UPDATE 
INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密碼') 
ON DUPLICATE KEY UPDATE 
_id = 'UpId',
password = 'upPassword';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我們再一次執行:

[SQL]INSERT INTO user_admin_t (_id,password) 
VALUES ('1','第一次插入的密碼') 
ON DUPLICATE KEY UPDATE 
_id = 'UpId',
password = 'upPassword';
受影響的行: 2
時間: 0.131s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看到 受影響的行爲2,這是因爲將原有的記錄修改了,而不是執行插入,看一下表中數據:

DUPLICATE後

原本‘id’爲‘1’的記錄,改爲了‘UpId’,‘password’也變爲了‘upPassword’,很好的解決了重複插入問題

擴展

當插入多條數據,其中不只有表中已存在的,還有需要新插入的數據,Mysql會如何執行呢?會不會報錯呢?

其實Mysql遠比我們想象的強大,他會智能的選擇更新還是插入,我們嘗試一下:

INSERT INTO user_admin_t (_id,password) 
VALUES 
('1','第一次插入的密碼') ,
('2','第二條記錄')
ON DUPLICATE KEY UPDATE 
_id = 'UpId',
password = 'upPassword';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

運行sql

[SQL]INSERT INTO user_admin_t (_id,password) 
VALUES 
('1','第一次插入的密碼') ,
('2','第二條記錄')
ON DUPLICATE KEY UPDATE 
_id = 'UpId',
password = 'upPassword';
受影響的行: 3
時間: 0.045s

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Mysql執行了一次修改,一次插入,表中數據爲:

多記錄插入

VALUES修改

那麼問題又來了,有人會說我ON DUPLICATE KEY UPDATE 後面跟的是固定的值,如果我想要分別給不同的記錄插入不同的值怎麼辦呢?

INSERT INTO user_admin_t (_id,password) 
VALUES 
('1','多條插入1') ,
('UpId','多條插入2')
ON DUPLICATE KEY UPDATE 
password =  VALUES(password);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

方法之一可以將後面的修改條件改爲VALUES(password),動態的傳入要修改的值,執行以下:

[SQL]INSERT INTO user_admin_t (_id,password) 
VALUES 
('1','多條插入1') ,
('UpId','多條插入2')
ON DUPLICATE KEY UPDATE 
password =  VALUES(password);
受影響的行: 4
時間: 0.187s

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

成功的修改了兩條記錄,刷新一下表

多條修改

我們成功的爲不同id的password修改成了不同的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章