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 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
参考
insert语句让我学会的两个MySQL函数的更多相关文章
- 值班问题:insert语句插入了两条数据?
上周值班,碰到这样的一个客户问题,表结构简化如下: CREATE TABLE `aa` (`c1` int(10) unsigned NOT NULL AUTO_INCREMENT,`c2` int( ...
- 40 | insert语句的锁为什么这么多?
在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁. 因此,insert 语句是一个很轻量的操作.不过,这个结论对于“普通的 insert 语句”才有 ...
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- 一条诡异的insert语句
问题背景 有同事反馈在mysql上面执行一条普通的insert语句,结果报错, execute failed due to >>> Incorrect string value: ' ...
- 使用C#导出MSSQL表数据Insert语句,支持所有MSSQL列属性
在正文开始之前,我们先看一下MSSQL的两张系统表sys.objects . syscolumnsMSDN中 sys.objects表的定义:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均 ...
- SQLite使用教程8 Insert 语句
http://www.runoob.com/sqlite/sqlite-insert.html SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添 ...
- SQL语句-INSERT语句
Insert语句 Insert语句三种写法: mysql> desc students; +-------+-------------+------+-----+---------+------ ...
- shell随机生成身份证,姓名,电话,日期,分数,等级和insert语句
#!/bin/bash#生成随机身份证号,性别,年龄,电话,姓名,日期,分数和对应等级,并生成insert语句#作者AiYS,2018-02-06,转载请注明http://www.cnblogs.co ...
- SQLite Insert 语句(http://www.w3cschool.cc/sqlite/sqlite-insert.html)
SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行. 语法 INSERT INTO 语句有两种基本语法,如下所示: INSERT IN ...
随机推荐
- Python判断文件和文件夹是否存在的方法
Python判断文件和文件夹是否存在的方法 这篇文章主要介绍了Python判断文件和文件夹是否存在的方法,本文还讲解了判断是否为文件或者目录的方法.os.path.lexist的作用.FTP中判断文件 ...
- mysql5.7以上版本安装
首先下载mysql5.7zip版本 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 然后放在本地解压 下载5.6版本 https:// ...
- Leetcode925.Long Pressed Name长按键入
你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字(其中一 ...
- Leetcode860.Lemonade Change柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...
- Directx11教程(5) 画一个简单的三角形(1)
原文:Directx11教程(5) 画一个简单的三角形(1) 在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作 ...
- oracle 数据库安全审计
Oracle的审计机制是用来监视用户对ORACLE数据库所做的各种操作. 在缺省情况下,系统的审计功能是关闭的.可以在INIT.ORA参数文件中将参数AUDIT_TRAIL设置为正整数来激活. 审计功 ...
- LA4094 WonderTeam
杯哥题解. //Serene #include<algorithm> #include<iostream> #include<cstring> #inclu ...
- swiper踩过的哪些坑
最近,苦恼于各种轮播的需求,每个自己都要自己写,写的挺烦的.终于,在网上发现了swiper插件,发现还是挺实用的,但其中还是踩过了不少的坑,其中有不少都是很简单的问题,但到发现的时候都是花了不少时间, ...
- python 错误类型
- 单颗GPU计算能力太多、太贵?阿里云发布云上首个轻量级GPU实例
摘要: 阿里云发布了国内首个公共云上的轻量级GPU异构计算产品——VGN5i实例,该实例打破了传统直通模式的局限,可以提供比单颗物理GPU更细粒度的服务,从而让客户以更低成本.更高弹性开展业务. 在硅 ...