我们要保存数据到数据库,插入数据是必须的,但是在业务中可能会出于某种业务要求,要在数据库中设计唯一索引;这时如果不小心插入一条业务上已经存在同样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

insert语句让我学会的两个MySQL函数相关推荐

  1. php的mysql5加密_PHP实现mysql加密算法mysql323和mysql5,即old_password()和password()两个mysql函数...

    由于mysql5.7之后,已经停用old_password函数了,所以这里用PHP实现mysql加密算法mysql323和mysql5,即old_password()和password()两个mysq ...

  2. access insert语句怎么写_码住!MySQL中超实用的几种SQL语句

    在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑.减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮. 目录 实用的SQL 1.插 ...

  3. db2 如何导出insert语句_《MySQL 入门教程》第 23 篇 DML 语句之插入数据

    文章来源:https://blog.csdn.net/horses/article/details/108287687 原文作者:不剪发的Tony老师 来源平台:CSDN 数据库的基本操作包括增.删. ...

  4. 使用LOAD DATA和INSERT语句导入Mysql数据

    在"MySQL数据库(表)的基本操作"一节中我们创建过一个会员注册表"Users",这次我们就往这个表中以不同的方式导入数据. INSERT语句 关于INSER ...

  5. linux mysql insert into_MySQL的INSERT语句小结

    MySQL的INSERT语法小结 mysql> create table addressbook(fname varchar(255) null,lname varchar(255) null, ...

  6. insert sql语句_SQL Insert语句概述

    insert sql语句 This article on the SQL Insert statement, is part of a series on string manipulation fu ...

  7. mysql数据库insert语句怎么写_MySQL数据库Insert语句7种写法

    简介 很多开发人员工作了几年之后,都会自嘲,自己啥技术都没学到,就会CRUD,可是我要说的是,CRUD你真的都会吗,你在MySQL数据库中,会几种insert语句写法呢.在这里我会7种写法,下面我就来 ...

  8. 值班问题:insert语句插入了两条数据?

    上周值班,碰到这样的一个客户问题,表结构简化如下: CREATE TABLE `aa` ( `c1` int(10) unsigned NOT NULL AUTO_INCREMENT, `c2` in ...

  9. SQL基础学习总结:6(INSERT语句的相关使用方法)

    数据的插入(INSERT语句的使用方法) 我们之前在表的创建部分简单地介绍了一下INSERT语句的功能和使用方法,现在我们再详细讲一下它的用法. INSERT语句的基本语法 其语法结构如下: INSE ...

最新文章

  1. js map、filter、forEach
  2. java学习笔记14--多线程编程基础1
  3. .net连接MYSQL数据库方法一
  4. 秒懂文件路径 / 和 ./ 和 ../ 和 ../../
  5. 如何解决SQL Server中SQL身份危机
  6. mysql执行语句_MySQL查看实时执行的SQL语句
  7. BizTalk开发系列(二十九) 宏的使用
  8. JavaScript 如何工作:渲染引擎和性能优化技巧
  9. 56. Attribute value 属性
  10. 【渝粤教育】电大中专药品储存与养护技术 (3)作业 题库
  11. 计算机软件 退货,如何在在电脑收银系统中实现商品退货
  12. 怎么做店铺客单价|盛天海科技
  13. 实时采集Canal快速入门
  14. Android RecyclerView详解及实现瀑布流式布局
  15. 机电一体化柔性生产线加工实训系统(5站)
  16. 三星:大小屏QLED和OLED两手都要抓,都要硬
  17. 宇枫资本投资理财投资入门与技巧
  18. Itext与pdfBox坐标定位问题
  19. 核心概念——节点/边/Combo——内置Combo——内置Combo总览
  20. 下拉菜单Spinner用法

热门文章

  1. poj2965-poj2965-The Pilots Brothers' refrigerator
  2. OpenCV+python:直方图的应用(一)
  3. java结束全部操作代码_Java创建与结束线程代码示例
  4. 加载多瓦片地图_手把手教 | 网络时空大数据爬取与分析DAS系统(瓦片地图获取)...
  5. 计算机在档案管理中的应用,浅谈计算机在档案管理中的应用
  6. ubuntu chrome java插件_在Ubuntu中为Chrome安装Java插件
  7. java需要记的语法,Java笔记(三)……基础语法
  8. python 正则表达式方法_Python正则表达式一: 基本使用方法
  9. 从底层剖析i++和++i的区别与相同点
  10. rust熔炉怎么带走_Rust游戏中12个实用小技巧,包含无伤下坠、直梯爬楼