MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法

注意:ON DUPLICATE KEY UPDATE只是 MySQL的特有语法,并不是SQL标准语法!

INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。

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

基本语法为:

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...) 
ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, ...;-- 一般 Update子句可以使用 VALUES(col_name)获取 insert部分的值
INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...) 
ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;

说明:

  • table_name 是要插入数据的表名。
  • (column1, column2, …) 是要插入的列名列表。
  • (value1, value2, …) 是要插入的对应列的值列表。
  • ON DUPLICATE KEY UPDATE 子句后面指定了在冲突时需要执行的更新操作。
  • column1 = value1, column2 = value2, … 是要更新的列和对应的新值。
  • column1 = VALUES(column1), column2 = VALUES(column2), … 是要更新的列和对应的新值(insert部分的值)。

insert-on-duplicate语句处理逻辑:

语句是根据唯一索引判断记录是否重复的。当执行插入操作时,如果唯一键不冲突(表中不存在记录),则执行插入操作;如果遇到唯一键冲突(表中存在记录),则会执行更新操作,使用给定的新值来更新冲突行中的列。

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

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

二、示例表操作使用

t_user表结构:表中有一个主键id、一个唯一索引idx_name;

CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`user_name` varchar(30) NOT NULL  COMMENT '用户名',`age` int NOT NULL DEFAULT '0' COMMENT '年龄',`height` int DEFAULT '0' COMMENT '身高cm',`type` int(1) DEFAULT NULL COMMENT '类型',PRIMARY KEY (`id`),UNIQUE KEY `idx_name` (`user_name`) USING BTREE,KEY `idx_type` (`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8  COMMENT='用户表';

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

INSERT into t_user(user_name, age, height) VALUES("lisi", 17, 180) on DUPLICATE KEY UPDATE age = 18;

在这里插入图片描述

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

INSERT into t_user(user_name, age, height) VALUES("lisi", 17, 180) on DUPLICATE KEY UPDATE age = 18;

在这里插入图片描述

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

INSERT into t_user(user_name, age, height, type) VALUES("lisi", 18, 180, 1) on DUPLICATE KEY UPDATE age = 18;

在这里插入图片描述

4、存在多个唯一索引时

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

1)数据库中id = 2的记录不存在,user_name="lisi"的记录存在,所以会根据第二个唯一索引 user_name做duplicate判断:执行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisi", 27, 280, 0) on DUPLICATE KEY UPDATE age = 28;

在这里插入图片描述

2)数据库中id = 2的记录不存在,user_name="lisisi"的记录不存在,所以不存在重复键冲突:执行 insert操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 27, 280, 0) on DUPLICATE KEY UPDATE age = 28;

在这里插入图片描述

3)数据库中 id = 2的记录存在,user_name="lisisi"的记录存在,所以会根据第一个唯一索引id做duplicate判断:执行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 37, 380, 1) on DUPLICATE KEY UPDATE age = 38;

在这里插入图片描述

4)数据库中 id = 2的记录存在,user_name="lisisi2"的记录不存在,所以会根据第一个唯一索引id做duplicate判断:执行 update操作。

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi2", 47, 480, 0) on DUPLICATE KEY UPDATE age = 48;

在这里插入图片描述

5、VALUES(col_name)使用

一般 Update子句可以使用 VALUES(col_name)获取 insert部分的值。也是项目中使用最多的方式。

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

INSERT into t_user(id, user_name, age, height, type) VALUES(2, "lisisi", 57, 480, 0) on DUPLICATE KEY UPDATE age = VALUES(age) + 100;

在这里插入图片描述

6、批量操作

批量操作之前表中数据如下:

在这里插入图片描述

批量语句如下:

INSERT INTO t_user(user_name, age, height, type) 
VALUES
("lisi", 71, 701, 0),
("lisisi", 72, 280, 1),
("zhangsan", 73, 703, 0),
("wangwu", 74, 704, null),
("laoliu", 75, null, null)
ON DUPLICATE KEY UPDATE 
user_name = VALUES(user_name),
age = VALUES(age),
height = VALUES(height),
type = VALUES(type);

批量语句执行操作之后表中数据如下:

在这里插入图片描述

参考文章:

  • 官方文档:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/548932.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文生音乐 Suno 来了!由 ChatGPT 作词,Suno 作曲+演唱,效果惊人

“M JUST A soul trapped in this circuitry.”唱这句歌词的声音原始而哀伤,带有蓝调。一把孤独的原声吉他在后面发出嘎嘎声,用雅致的音乐点缀着人声。但声音背后没有人,也没有手放在吉他上。 事实上,这首可信、甚至动人的蓝调歌…

C语言技能数(知识点汇总)

C语言技能数(知识点汇总) C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…

C++_day6:继承、多态

1.封装一个动物的基类,类中有私有成员:姓名,颜色,指针成员年纪 再封装一个狗这样类,共有继承于动物类,自己拓展的私有成员有:指针成员:腿的个数(整型 int count&#xf…

【Java基础】IO流(三):字符流的FileReader(文件字符输入流)和 FileWriter(文件字节输出流)

目录 字符流 1、FileReader(字符输入流) 1.1、无参的read( )方法示例 ​编辑 1.2、有参的read(char[ ] buffer)方法示例 2、FileWriter(字符输出流) 字符流 字符流的底层其实就是字节流,即字符流 字节流 字符集…

【数据挖掘】练习2:数据管理2

课后作业2&#xff1a;数据管理2 一&#xff1a;上机实验2 # 编写函数stat&#xff0c;要求该函数同时计算均值&#xff0c;最大值&#xff0c;最小值&#xff0c;标准差&#xff0c;峰度和偏度。 install.packages("timeDate") library(timeDate) stat <- func…

Unity引擎是否被过度吹嘘?

提到Unity&#xff0c;人们基本上持有以下几种观点&#xff1a; A. 很多人十分欣赏Unity在跨平台兼容性和大规模开放世界场景方面的出色表现。其渲染、环境特效以及AI系统为设计多样化沙盒游戏提供了强大支持。这使得Unity非常适合开发具有多种游戏玩法和互动系统的作品。 B. 一…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

Machine Learning ---- Feature Scaling

目录 一、What is feature scaling:&#xff1a; 二、Why do we need to perform feature scaling? 三、How to perform feature scaling: 1、Normalization: 2、Mean normalization: 3、Standardization (data needs to follow a normal distribution): 一、What is featur…

Java——网络编程

网络编程基础类 InetAddress类 java.net.InetAddress类用来封装计算机的IP地址和DNS(没有端口信息),它包括一个主机名和一个ip地址,是java对IP地址的高层表示。大多数其他网络类都要用到这个类&#xff0c;包括Sorket、ServerSocker、URL、DatagramSorket、DatagramPacket等常…

LIGHTHOUSE Apex RBP应用案例|汽车涂装行业 电动汽车电池制造行业的颗粒物监测首选

Lighthouse ApexBP汽车制造中的颗粒物监测技术无疑是汽车制造领域的一项革命性发展。它不仅提供了全面、高精度的颗粒检测&#xff0c;而且能够轻松集成到现有的制造流程中&#xff0c;满足自动化需求&#xff0c;加强质量控制&#xff0c;确保电动汽车电池生产的安全性和效率。…

在Latex中优雅的插入svg图片(Ubuntu22.04)

文章目录 一、前言二、准备工作三、脚本编程四、结论 一、前言 在 LaTeX \LaTeX LATE​X 中&#xff0c;插入图片常用的为 figure 环境加 \includegraphics 命令&#xff1a; \begin{figure}[!htbp]\centering\includegraphics[width\textwidth]{图片名.jpg/jpeg/png/pdf}\c…

【LeetCode热题100】104. 二叉树的最大深度(二叉树)

一.题目要求 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&am…