当前位置: 首页 > news >正文

mysql特殊语法insert into .. on duplicate key update ..使用详解

文章目录

  • 一、前言
  • 二、insert into … on duplicate key update ...
    • 1、处理逻辑
    • 2、示例:
      • 表结构
      • 1> 不存在记录,插入的情况
      • 2> 存在记录,可以更新字段的情况
      • 3> 存在记录,不可以更新字段的情况
      • 4> 存在多个唯一索引时
        • 1)数据库中id = 12的记录不存在,userName="saint22"的记录存在,所以会根据第二个唯一索引userName做duplicate判断;
        • 2)数据库中id = 10的记录存在,userName="saint22"的记录存在,所以会根据第一个唯一索引id做duplicate判断;
      • 3、Update子句获取inset部分的值
      • 4、last_insert_id()

一、前言

在日常开发中,经常会遇到这样的需求:查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段。

比如下列伪代码:

$row = mysql_query($result);

if($row){

mysql_execute('update ...');

}else{

mysql_execute('insert ...');

}

二、insert into … on duplicate key update …

MySql针对此,提供了insert into … on duplicate key update …的语法:

  • 在insert的时候,如果insert的数据会引起唯一索引(包括主键索引)的冲突,即唯一值重复了,则不会执行insert操作,而执行后面的update操作。

注意:这个是MYSQL特有的,不是SQL标准语法;

1、处理逻辑

insert into … on duplicate key update …语句是根据唯一索引判断记录是否重复的;

  • 如果不存在记录,插入,则影响的行数为1;
  • 如果存在记录,可以更新字段,则影响的行数为2;
  • 如果存在记录,并且更新的值和原有的值相同,则影响的行数为0。

如果表同时存在多个唯一索引,只会根据第一个在数据库中存在相应value的唯一索引做duplicate判断:

2、示例:

表结构

CREATE TABLE `user2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(94) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(1) DEFAULT NULL,
  `type` int(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idex_name` (`userName`) USING BTREE,
  KEY `idx_type` (`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

user2表中有一个主键id、一个唯一索引idx_userName;

1> 不存在记录,插入的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

在这里插入图片描述

2> 存在记录,可以更新字段的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

在这里插入图片描述

3> 存在记录,不可以更新字段的情况

insert into user2(userName, age, gender) VALUES("saint33", 99, 1) on DUPLICATE KEY UPDATE age = 88;

在这里插入图片描述

4> 存在多个唯一索引时

如果表同时存在多个唯一索引,只会根据第一个在数据库中存在相应value的唯一索引做duplicate判断:

1)数据库中id = 12的记录不存在,userName="saint22"的记录存在,所以会根据第二个唯一索引userName做duplicate判断;

insert into user2(id, userName, age, gender) VALUES(12, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 80;

在这里插入图片描述

2)数据库中id = 10的记录存在,userName="saint22"的记录存在,所以会根据第一个唯一索引id做duplicate判断;

insert into user2(id, userName, age, gender) VALUES(10, "saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(gender) + 90;

在这里插入图片描述

3、Update子句获取inset部分的值

Update子句可以使用values(col_name)获取insert部分的值:

insert into user2(userName, age, gender) VALUES("saint22", 99, 1) on DUPLICATE KEY UPDATE age = VALUES(age) + 100;

在这里插入图片描述

注意:VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL;

4、last_insert_id()

如果表含有auto_increment字段,使用insert … on duplicate key update插入或更新后,last_insert_id()返回auto_increment字段的值。

相关文章:

  • 闭包:什么是闭包、闭包的作用、闭包的解决
  • 【概率论与数理统计(研究生课程)】知识点总结7(参数估计)
  • 精彩回顾 l Rust唠嗑室:Xline跨数据中心一致性管理
  • vue进阶04-vue文档生成工具vuepress2
  • HDLBits: 在线学习 SystemVerilog(十一)-Problem 60-64
  • Linux环境基础开发工具使用
  • IDEA使用swing创建应用程序
  • 22.0、C语言数据结构——二叉排序树
  • GSW同态加密方案学习
  • Java -- 每日一问:Exception 和 Error 有什么区别?
  • 使用 Typora 画图
  • Gradle 入门说难也不难,说简单吧也不简单~
  • 层次聚类分析及代码实现
  • 学生选课系统 前后端分离 vue springboot
  • 网络安全比赛A模块任务书
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 〔开发系列〕一次关于小程序开发的深度总结
  • css选择器
  • Java 内存分配及垃圾回收机制初探
  • JAVA之继承和多态
  • nfs客户端进程变D,延伸linux的lock
  • nginx 负载服务器优化
  • React Transition Group -- Transition 组件
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 闭包,sync使用细节
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 聊聊directory traversal attack
  • 思否第一天
  • 一个完整Java Web项目背后的密码
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #在 README.md 中生成项目目录结构
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .form文件_一篇文章学会文件上传
  • .gitignore文件—git忽略文件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET开源快速、强大、免费的电子表格组件
  • .Net中的设计模式——Factory Method模式
  • .net中生成excel后调整宽度
  • /etc/fstab和/etc/mtab的区别
  • ??myeclipse+tomcat
  • @Valid和@NotNull字段校验使用
  • @取消转义
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)