我們要保存數據到數據庫,插入數據是必須的,但是在業務中可能會出於某種業務要求,要在數據庫中設計唯一索引;這時如果不小心插入一條業務上已經存在同樣key的數據時,就會出現異常。
大部分的需求要求我們出現唯一鍵沖突時就更新這條數據,這時我們就可以用下面這條MySQL語句了:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_name [, partition_name] ...)] [(col_name [, col_name] ...)] {VALUES | VALUE} (value_list) [, (value_list)] ... [ON DUPLICATE KEY UPDATE assignment_list]
這個就是MySQL官方的INSERT ... ON DUPLICATE KEY UPDATE語句語法
對於上面的 assignment_list 我們常常這樣寫:(假設a所在列是數據庫中的唯一主鍵)
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE b=b, c=c;
但是在業務上,對於b和c列的值並不是所有的數值都是需要更新到數據庫里的,比如說:b列不能為null,為空就不更,c列不能小於0,小於0時就不更新,那么上面的語句我們就必須改改了:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE b= IF(VALUES(b), VALUES(b), b), c= IF(VALUES(c) > 0, VALUES(c), c);
我這次要說的就是這兩個函數if和values
下面就看官網怎么說了:
In an
INSERT ... ON DUPLICATE KEY UPDATEstatement, you can use theVALUES(function in thecol_name)UPDATEclause to refer to column values from theINSERTportion of the statement. In other words,VALUES(in thecol_name)UPDATEclause refers to the value ofcol_namethat would be inserted, had no duplicate-key conflict occurred. This function is especially useful in multiple-row inserts. TheVALUES()function is meaningful only in theON DUPLICATE KEY UPDATEclause ofINSERTstatements and returnsNULL
和
If
expr1isTRUE(andexpr1<> 0),expr1<> NULLIF()returnsexpr2. Otherwise, it returnsexpr3.
對於if函數來說,就是根據條件二選一了,沒啥可說的,
對於values函數來說,只有在on duplicate key update語句里才有意義,而且返回值,是你要插入的數值,而不是已經在數據庫里的數值。
隨便發現了南洋理工的sql教程,很贊:https://www.ntu.edu.sg/home/ehchua/programming/sql/MySQL_Beginner.html
