ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句,主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时(即试图插入的记录的键值已经存在于表中),此子句会触发一个更新操作,而不是抛出错误。

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

基本语法

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
    column1 = value1,
    column2 = value2,
    ...;

ON DUPLICATE KEY UPDATE子句处理逻辑

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

示例

假设我们有一个用户表 users,包含 id(主键)、username(用户名,唯一)和 email 三个字段。现在我们要插入或更新一条用户记录,如果用户名已经存在,则只更新用户的邮箱地址。

表结构如下:

CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(255) UNIQUE NOT NULL,
  `email` VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

不存在记录,插入的情况

使用insert into插入已有的username,可以看到会报错

 使用ON DUPLICATE KEY UPDATE 子句插入已有的username,没有报错执行成功

总结:在上面这个例子中,如果尝试插入的用户名 '杜甫' 已经存在于表中,由于 username 字段设置了唯一约束,这将触发 ON DUPLICATE KEY UPDATE 子句。然后,这条 SQL 语句不会插入新的记录,而是执行更新操作,将该用户名对应的邮箱地址更新为 'libai@163.com'。如果用户名不存在,则正常插入新记录。

可能看到这里就会有人问了那么为什么不使用update呢,简单的来说不都是更新数据吗?

使用 ON DUPLICATE KEY UPDATE 与直接使用 UPDATE 语句的主要区别在于处理数据插入和更新的策略和目的。

下面是选择 ON DUPLICATE KEY UPDATE 而不直接使用 UPDATE 的几个主要原因:

  1. 同时处理插入与更新ON DUPLICATE KEY UPDATE 允许在一个操作中同时尝试插入新记录和更新现有记录。如果记录不存在,就插入新记录;如果存在(根据唯一索引或主键判断),则更新记录。这样可以在不确定记录是否存在的情况下,通过一次操作完成“插入或更新”,简化逻辑和代码。

  2. 减少查询开销:相比于先执行查询判断记录是否存在,再根据结果决定执行 INSERTUPDATEON DUPLICATE KEY UPDATE 直接在数据库层面处理,减少了额外的查询请求,降低了网络和计算开销。

  3. 原子性操作:在事务中使用时,ON DUPLICATE KEY UPDATE 作为一个整体操作,要么全部成功,要么全部失败,保证了数据操作的原子性,这对于维护数据一致性非常重要。

  4. 避免并发冲突:在高并发环境下,先查询后更新可能会遇到“丢失更新”的问题。而 ON DUPLICATE KEY UPDATE 通过数据库的内置机制处理冲突,有助于减少这类并发问题。

  5. 简化逻辑:对于批量数据处理,特别是导入大量数据时,使用 ON DUPLICATE KEY UPDATE 可以显著简化代码逻辑,避免编写复杂的循环判断逻辑。

总结ON DUPLICATE KEY UPDATE 提供了一种高效、简洁的方式来处理那些在插入数据时可能遇到的重复记录问题,特别适用于那些需要“如果存在则更新,否则插入”的场景,而直接使用 UPDATE 则更适合于确定记录已经存在并且需要修改的情况。

当然还有ON DUPLICATE KEY UPDATE 子句和 REPLACE INTO 语句的区别会在下一篇文章中介绍

使用 ON DUPLICATE KEY UPDATE 子句的场景及优缺点

使用场景优点缺点
数据去重与更新自动处理冲突,减少编程逻辑对于大量并发可能产生锁竞争,影响性能
数据同步简化数据同步流程,避免手动检查更新逻辑需精确设计,以免误更新非冲突字段
统计计数有效累加计数,避免重复记录需要确保更新逻辑正确,避免数据不一致
确保数据一致支持事务处理,增强数据完整性对于复杂更新逻辑处理能力有限
简化逻辑一行命令完成“插入或更新”,代码简洁对唯一性约束依赖性强,表设计需预先规划

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

AI Agent 热门的10篇论文

人工智能代理领域广阔,涵盖广泛的主题,包括多代理系统、强化学习、上下文感知系统以及将大型语言模型 (LLMs) 集成到基于代理的系统中。以下是 arXiv 的一些顶级论文,涵盖了人工智能代理的各个方面: A Framework For Intelligent Multi Agent System Based Neural Network …

rman恢复后,少部分数据文件状态为MISSING000**

客户有套一体机,每天晚上21点开始做rman完全备份,大约第2天上午9点多完成备份,rman备份保留策略保留一份完全备份 6月1日晚21点自动发起备份,6月2日上午10点15分完成备份,并生成了一个控制文件备份 c-4063271871-2024…

量产导入 | KGD 是什么?

文章目录 KGD 是什么?认识KGD定义、功能与应用实例【白话文解析】Known Good「Die」何谓良品裸晶粒 (KGD/KGD Die)?解读KGD产业应用为什么大家纷纷采用KGD? 一窥KGD与芯片封测大趋势 KGD 是什么?认识KGD定义…

【Linux系统】线程与线程控制

本篇博客整理了Linux下线程的概念、线程控制的相关接口,旨在让读者初步认识线程,并为下一篇多线程作铺垫。 目录 一、线程是什么 1.线程是进程的执行流 2.线程的执行、调度、切换 3.页表分级与线程资源分配 4.线程的优缺点 二、线程控制 1.创建…

mmdeploy环境部署流程

参考:mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境: docker容器,ubuntu20.04,cuda11.7…

【万方数据库爬虫简单开发(自用)】

万方数据库爬虫简单开发(自用)(一) 使用Python爬虫实现万方数据库论文的搜索并获取信息1.获取url2.输入关键词3.使用BeautifulSoup解析4.获取文章标题信息 使用Python爬虫实现万方数据库论文的搜索并获取信息 后续会逐步探索更新…

从盛世到衰落,历史上八大强国的兴衰与现代地位!

人类文明史悠久,从远古时代至今日,世界舞台上曾经涌现出许多强盛的帝国。它们在自己的黄金时代,曾经无人能敌,不论是在军事、经济还是文化上都独领风骚。然而,无论多么强大的国家也难逃“兴盛必衰”的命运。今天&#…

javaWeb项目-在线考试系统详细功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Java简介 Java语…

ArcGIS 10.8软件安装包免费下载及安装教程

安装包获取: 【软件名称】:ArcGIS 10.8 【安装包链接 】: 链接:https://pan.quark.cn/s/2240330bf935 提取码:Yixn 【备用链接】: 链接:https://pan.baidu.com/s/13V5o_igcK0suW4SFsWkxeQ?pwdj6kx 提取码…

Springboot 整合 Flowable(一):使用 flowable-UI 绘制流程图

目录 一、Flowable简介 二、Flowable 与 Activiti 的区别 三、流程图的绘制(以员工请假流程图为例) 1、下载 flowable 的压缩包: 2、启动包中的 tomcat 3、登录页面 4、绘制结束,导出 bpmn20.xml文件 一、Flowable简介 Fl…

拥抱AI-图片学习中的卷积神经算法详解

一、定义 卷积神经算法(Convolutional Neural Networks, CNN)是深度学习领域中的一种重要算法,特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释: 1. 基本概念 定义:卷积神经网络是一类包含卷积计算且具…

Oracle的优化器

sql优化第一步:搞懂Oracle中的SQL的执行过程 从图中我们可以看出SQL语句在Oracle中经历了以下的几个步骤: 语法检查:检查SQL拼写是否正确,如果不正确,Oracle会报语法错误。 语义检查:检查SQL中的访问对象…

文件IOoooo

1.1 文件路径 文件路径分为两种: 1、绝对路径:以C:、D:等盘符开头的,就是我们所说的绝对路径,根据它可以直接找到文件的具体位置。 2、相对路径:需要先指定一个目录作为基准目录,从基准目录出发&#xf…

python的resample()函数

介绍 在Python中,resample()函数是一个常用的工具,用于对时间序列数据进行重新采样。这个函数可以将时间序列数据从一个频率转换为另一个频率,比如将每天的数据转换为每月的数据。在本教程中,我将向你展示如何使用resample()函数,并解释每个步骤的具体含义。 整体流程 首先…

SAP PP学习笔记20 - 复习总结一下MTS,MTO,ATO的各种生产策略

上面几章详细讲了MTS,MTO,ATO的各种生产策略。 内容太多了,本章咱们就简单回顾,复习一下。 计划策略(Planning Strategies) 的种类 - MTS(Make-to-Stock):按库存生产(見込生産&…

SAP CR02 更改工作中心 CRAP_WORKCENTER_CHANGE

SAP 创建,修改工作中心实例代码 SE24 CL_PP_WORK_CENTER_BO Work Center API Business Object UPDATE_CAPACITY Update Capacity GET_INSTANCE Get instance of class CL_PP_WORK_CENTER_BO CREATE_WORK_CENTER Create Work Center UPDATE_WORK_CENTER …

STM32硬件接口I2C应用(基于HMC5883L)

目录 概述 1 STM32Cube控制配置I2C 1.1 I2C参数配置 1.2 使用STM32Cube产生工程 2 HAL库函数介绍 2.1 初始化函数 2.2 写数据函数 2.3 读数据函数 3 认识HMC5883L 3.1 HMC5883L功能介绍 3.2 HMC5883L的寄存器 4 HMC5883L驱动程序实现 4.1 驱动函数实现 4.2 完整驱…

如何通过数据库与AI实现以图搜图?OceanBase向量功能详解

OceanBase支持向量数据库的基础能力 当前,数据库存储系统与人工智能技术的结合,可以体现在两个主要的应用方向上。 一、近似搜索。它利用大语言模型(LLM,简称大模型)的嵌入(embedding)技术&am…

如何低成本、高效搭建线上3D艺术展?

随着数字技术的日新月异,艺术展览领域正迎来一场革新。未来的艺术展览将不再是单一的线下体验,而是线上线下相互融合,其中,3D线上展览将成为线下展览的重要延伸与拓展,为广大观众提供更多元化的选择。 对于艺术家和策…