insert語句讓我學會的兩個MySQL函數


我們要保存數據到數據庫,插入數據是必須的,但是在業務中可能會出於某種業務要求,要在數據庫中設計唯一索引;這時如果不小心插入一條業務上已經存在同樣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 UPDATE statement, you can use the VALUES(col_name) function in the UPDATEclause to refer to column values from the INSERT portion of the statement. In other words, VALUES(col_name) in the UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred. This function is especially useful in multiple-row inserts. The VALUES() function is meaningful only in the ON DUPLICATE KEY UPDATE clause of INSERT statements and returns NULL

If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL), IF() returns expr2. Otherwise, it returns expr3.

對於if函數來說,就是根據條件二選一了,沒啥可說的,

對於values函數來說,只有在on duplicate key update語句里才有意義,而且返回值,是你要插入的數值,而不是已經在數據庫里的數值。

隨便發現了南洋理工的sql教程,很贊:https://www.ntu.edu.sg/home/ehchua/programming/sql/MySQL_Beginner.html

參考

insert語法

if函數

values函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM