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函数

posted @ 2017-12-11 18:10  halu126  阅读(3312)  评论(0编辑  收藏  举报