MySQL: ON DUPLICATE KEY UPDATE 用法,mysqlduplicate

來源:互聯網
上載者:User

MySQL: ON DUPLICATE KEY UPDATE 用法,mysqlduplicate
使用該文法可在插入記錄的時候先判斷記錄是否存在,如果不存在則插入,否則更新,很方便,無需執行兩條SQL 

這個語句知識mysql中,而標準sql語句中是沒有的。 

INSERT INTO .. ON DUPLICATE KEY更新多行記錄 

如果在INSERT語句末尾指定了ON DUPLICATE KEY UPDATE,並且插入行後會導致在一個UNIQUE索引或PRIMARY KEY中出現重複值,則執行舊行UPDATE;如果不會導致唯一值列重複的問題,則插入新行。例如,如果列a被定義為UNIQUE,並且包含值1,則以下兩個語句具有相同的效果: 
原本需要執行3條SQL語句,如下:
代碼如下:

IF (SELECT * FROM t_table WHERE id=1001') {    UPDATE t_table SET cnt=cnt+1 WHERE id=1001;} else {    INSERT INTO ipstats (id, cnt) VALUES (1001, 1);}
現在,代碼如下:
insert into t_table (id,cnt) values(1001,2) on duplicate key update cnt=cnt+1; 
update t_table set cnt=cnt+1 WHERE id=1001; 

如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。 

現在問題來了,如果INSERT多行記錄, ON DUPLICATE KEY UPDATE後面欄位的值怎麼指定?要知道一條INSERT語句中只能有一個ON DUPLICATE KEY UPDATE,到底他會更新一行記錄,還是更新所有需要更新的行。這個問題困擾了我很久了,其實使用VALUES()函數一切問題都解決了。 

舉個例子,欄位a被定義為UNIQUE,並且原資料庫表table中已存在記錄(2,2,9)和(3,2,1),如果插入記錄的a值與原有記錄重複,則更新原有記錄,否則插入新行: 

代碼如下:
INSERT INTO TABLE (a,b,c) VALUES (1,2,3), (2,5,7), (3,3,6), (4,8,2) ON DUPLICATE KEY UPDATE b=VALUES(b); 

以上SQL語句的執行,發現(2,5,7)中的a與原有記錄(2,2,9)發生唯一值衝突,則執行ON DUPLICATE KEY UPDATE,將原有記錄(2,2,9)更新成(2,5,9),將(3,2,1)更新成(3,3,1),插入新記錄(1,2,3)和(4,8,2) 

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有文法,並不是SQL標準文法!
MYSQL的ON DUPLICATE KEY UPDATE奇怪問題,內詳

設主鍵沒
 
MYSQL ON DUPLICATE KEY UPDATE的非常奇怪的問題,內詳

的發言:沒經過思考就發出來了,有灌水混分的嫌疑今今丫丫 的發言:非常UNIX_TIMESTAMP(curdate())-dateline 是變數。 - 問題補充: 具體說UNIX
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.