首页 > insert语句让我学会的两个MySQL函数

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

转载于:https://www.cnblogs.com/halu126/p/8024379.html

更多相关:

  • 我今天做项目出现ORA-00911: 无效字符问题,   我把SQL打到控制台上面,然后COPY到SQL PULS中是可以插入数据的, 但是在ECLIPSE中执行就报ORA-00911: 无效字符的错误,   我查了一下, 我的是类似这种的insert   into  tablea(aaa)   values('111'); 把最后面...

  • [引用:http://www.programfan.com/blog/article.asp?id=28128] --不足:23山东和16山东重复--创建DBPromary数据库 create database DBPromaryuse DBPromarygo --创建promary表create table promary( pro...

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 这是第三部分,完成效果如下 图1 建图和导航 三、使用RTAB-Map进行建图和导航 1. rtab...

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 由于之前的虚拟机性能限制,我在这个项目中使用了新的ubantu 16.04环境,虚拟机配置 内存 8GCPU...

  • [{name:1},{name:2}].forEach((v,i,ar) => {console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v) => v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变原始数组)[{name:1},{name:2},{name:3}...

  • 体验内容 使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图。 1. 安装一些依赖包 sudo apt-get install ros-melodic-move-base* sudo apt-get install ros-melodic-map-server* sudo apt-get insta...

  • 前言 我们知道Java/Python这种语言能够很好得 支持反射。反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 从而做出对应的操作。 而C++ 并没有友好得支持这样的操作,而最近工作中需要通过C++实现http接口,这个过程想要代码实现得优雅...

  • 上篇笔记中梳理了一把 resolver 和 balancer,这里顺着前面的流程走一遍入口的 ClientConn 对象。ClientConn// ClientConn represents a virtual connection to a conceptual endpoint, to // perform RPCs. // //...

  • 我的实验是基于PSPNet模型实现二维图像的语义分割,下面的代码直接从得到的h5文件开始往下做。。。 也不知道是自己的检索能力出现了问题还是咋回事,搜遍全网都没有可以直接拿来用的语义分割代码,东拼西凑,算是搞成功了。 实验平台:Windows、VS2015、Tensorflow1.8 api、Python3.6 具体的流程为:...

  • Path Tracing 懒得翻译了,相信搞图形学的人都能看得懂,2333 Path Tracing is a rendering algorithm similar to ray tracing in which rays are cast from a virtual camera and traced through a s...

  • configure_file( [COPYONLY] [ESCAPE_QUOTES] [@ONLY][NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) 我遇到的是 configure_file(config/config.in ${CMAKE_SOURCE_DIR}/...

  •     直接复制以下代码创建一个名为settings.xml的文件,放到C:UsersAdministrator.m2下即可