MySQL 插入更新语句(insert…on duplicate key update语句 )

news/2025/2/22 6:17:55

我们日常在使用 insert into 语句向表中插入数据时,一定遇到过主键或唯一索引冲突的情况,当遇到这种情况时,MySQL默认的反应是报错并停止执行后续的语句,为了避免这种情况,你有3种选择:

  • 使用insert ignore into语句忽略冲突语句并继续执行。
  • 使用replace into语句对冲突记录进行替换,用法见链接:MySQL 插入替换语句(replace into statement)
  • 使用insert…on duplicate key update语句对冲突记录进行更新。

文章目录

  • 一、insert … on duplicate key update语句简介
    • 1.1 基本用法
    • 1.2 同时引用新旧值

一、insert … on duplicate key update语句简介

1.1 基本用法

创建一张测试表test,其中id为主键,并插入2条数据:

sql">create table test(
id int not null auto_increment primary key,
source varchar(16),
val int,
conflict int);

truncate table test;
insert into test values(1,'insert',100,0),(2,'insert',200,0);
table test;

在这里插入图片描述

下面使用insert…on duplicate key update语句插入2条记录,其中id=1的记录将与原表中的记录产生主键冲突:

sql">insert into test values(3,'insert_update',300,0),(1,'insert_update',400,1) 
on duplicate key update conflict=conflict+1; 
table test;

在这里插入图片描述
根据执行结果,可以看到on dupldate update语句存在下面特点:
- 当不存在主键或唯一键冲突时,它就是普通的insert语句(id=3)。
- 当存在主键或唯一键冲突时,它会插入失败,同时执行on duplicate update后的语句。
- 成功插入时影响1行,出现冲突时影响2行,因此这里影响的数据行是3。

1.2 同时引用新旧值

insert…on update 语句最大的用处还是在出现冲突时,可以同时对新旧值进行引用,这意味着它非常适合需要累加的场景。

现在要求当出现ID冲突时将新旧的val值累加保存到表中,通过列名可以直接引用表中的旧值,而通过values(列名)可以引用即将插入的新值:

sql">insert into test values(1,'insert_update',300,0) 
on duplicate key update conflict=conflict+1, val=val+values(val); 

在这里插入图片描述

除了使用values函数,还可以通过给新增的列取别名,并通过别名引用,例如将新插入的列取名为new,上面的语句可以改写为:

sql">insert into test values(1,'insert_update',300,0) as new
on duplicate key update test.conflict=test.conflict+1, test.val=test.val+new.val; 

在这里插入图片描述

上面的语句中由于记录new默认和原表字段名相同,所以要通过前缀来区分新旧记录,你也直接给new的字段取不同的别名:

sql">insert into test values(1,'insert_update',300,0) as new(a,b,c,d)
on duplicate key update conflict=conflict+1, val=val+c; 

在这里插入图片描述

以上即是insert…on update 语句的基本用法,结合insert ignore和replace into语句,你即可以在出现insert主键或唯一键冲突时根据需要选择合适的处理方案。


http://www.niftyadmin.cn/n/5861767.html

相关文章

【中间件开发】kafka使用场景与设计原理

文章目录 前言一、MessageQueue1.1 定义1.2 使用消息队列的场景1.2.1 异步处理1.2.2 流量控制1.2.3 服务解耦1.2.4 发布订阅1.2.5 高并发缓冲1.3 基本概念和原理1.3.1 点对点消息队列模型 -- 线程池1.3.2 发布订阅消息模型-Topic --上课通知1.3.3 消息的ACK确认机制 二、Kafka2…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制?2.2 如何将注意力机制集成到YOLOv8中?2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块?3.3 效果分析 4. 卷积操作的优化4.1 卷积操…

ABAP数据库表的增改查

数据表的增改查 接到一个任务,是对数据库表的增改查,增和查现在已经比较熟练了,关键是改,还有一个要求是要求系统能自动更新修改人和修改日期以及时间。 找到数据库表,新增这三个字段 这里另提一句,一般数…

【C/C++】合并两个有序链表 (leetcode T21)

核心考点预览:链表 (双指针) 技巧:虚拟头结点 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入输出示例1l1 [1,2,4], l2 [1…

3D全景沉浸式看车:虚拟现实重构汽车消费新体验

在传统的汽车消费模式中,消费者往往需要亲自前往展厅,花费大量时间和精力去挑选心仪的车型。这一过程不仅成本高,而且信息的透明度也常常受到质疑。面对琳琅满目的车型,消费者往往难以在短时间内做出决策,而车企则面临…

windows上vscode cmake工程搭建

安装vscode插件: 1.按装fastc(主要是安装MinGW\mingw64比较方便) 2.安装C,cmake,cmake tools插件 3.准备工作完成之后,按F1,选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…

每日一题——打家劫舍

打家劫舍(一)与打家劫舍(二)动态规划解法详解 打家劫舍(一)问题描述示例解题思路动态规划 代码实现复杂度分析 打家劫舍(二)问题描述示例解题思路环形问题的拆分 代码实现复杂度分析…

豆包 Marscode + deepseek-R1 使用体验

拥抱 deepseek 这次豆包 Marscode 的新特性,是可以选择当下最热门的 deepseek 的两款模型:V3 和 R1,这让原本好用的 ai 插件,更加好用了,而且是免费使用,程序员的生产力再一次得到提升。 使用过程中的几…