MySQL数据库upsert使用

news2024/10/7 18:29:35

 本文翻译自:MySQL UPSERT - javatpoint,并附带自己的一些理解和使用经验.

MySQL UPSERT

UPSERT是数据库管理系统管理数据库的基本功能之一,它允许数据库操作语言在表中插入一条新的数据或更新已有的数据。UPSERT是一个原子操作,也就是说它是一个单步完成的操作。当UPSERT操作的是一条新数据时,会触发INSERT操作,若记录已经存在于表中,则UPSERT类似于UPDATE语句。

默认情况下,MySQL提供了ON DUPLICATE KEY UPDATE选项给INSERT语句来实现UPSERT功能。然而,INSERT还有一些其他选项来满足目标,比如INSERT IGNORE或REPLACE,我们将会学习并了解所有这些方案的细节。

MySQL UPSERT Example

我们可以通过以下三种方式来实现MySQL UPSERT操作:

  1. INSERT IGNORE
  2. REPLACE
  3. INSERT ON DUPLICATE KEY UPDATE

INSERT IGNORE

当我们向表中插入非法行时,INSERT IGNORE语句会忽略执行时的error。比如,主键列不允许我们存储重复值。当我们使用INSERT向表中插入一条数据,而这条数据的主键已经在表中存在了,此时MySQL服务器生成error,语句执行失败。然而,当我们使用INSERT IGNORE来执行此语句时,MySQL服务器将会生成warning而不是error。

当我们使用INSERT IGNORE批量插入数据时,产生了warning的行会被忽略,即不会被插入表中。

语法:

INSERT IGNORE INTO table_name (column_names)  
VALUES ( value_list), ( value_list) .....;  

例子:

先创建一张表,主键为id,同时还有一个唯一索引email,所以id,email 都不能重复,当插入的数据和这两个字段中的任意一个重复时,就会产生warning,从而使INSERT IGNORE忽略这条数据。

 向表中插入三条数据:现在我们执行下面语句:

可知,主键或唯一索引重复都会导致服务器报错,在执行批量插入时,一条语句报错会使整个批量插入无效。但当我们使用INSERT IGNORE时,主键或为一索引重复只会产生warning,同时,INSERT IGNORE会忽视这些产生的warning的行,将没有产生warning的行插入表中:

REPLACE

在某些情况下,我们希望更新已经存在的数据。此时可以使用REPLACE,当我们使用REPLACE命令时,可能会有下列两种情况发生:

  • 如果数据库中没有对应的记录,则执行标准的INSERT语句
  • 如果数据库中有对应的记录,则REPLACE语句会先删除数据库中的对应记录,再执行标准的INSERT语句(当主键或唯一索引重复时,会执行此更新操作)

在REPLACE语句中,更新数据分为两步,先删除原有记录,在插入要更新的记录。

语法:

REPLACE [INTO] table_name(column_list)  
VALUES(value_list);  

例子:

上面的代码中我们通过REPLACE操作两条数据,其中,第一条数据在数据库中没有与之冲突的主键或索引,所以执行插入操作,影响了1行数据;第二条数据与数据库中有主键冲突,所以会先删除数据库中原有数据,再将该数据插入数据库,以实现更新效果,删除一行、插入一行 ,影响了两行数据,所以此次操作一共影响了三行。

INSERT ON DUPLICATE KEY UPDATE

目前为止,我们已经看过两种UPSERT命令了,但它们都有一些限制。INSERT IGNORE只是简单忽略了duplicate error。REPLACE会检测INSERT error,但是它在添加新数据前会删除原有数据。因此,我们仍然需要一种更好的解决方案。

INSERT ON DUPLICATE KEY UPDATE是一个更好的解决方案,它不会删除重复的行,当我们在SQL语句中使用ON DUPLICATE KEY UPDATE子句并且有一行数据在主键或唯一索引上产生duplicate error时,会在已有的数据上做更新。

语法:

INSERT INTO table (column_names)  
VALUES (data)  
ON DUPLICATE KEY UPDATE   
column1 = expression, column2 = expression...;  

例子:

当使用INSERT ON DUPLICATE KEY UPDATE插入一条不存在的数据时,结果和INSERT一样:

主键冲突:

唯一索引冲突:

同时有多个唯一索引冲突或主键和唯一索引同时冲突时,一样会导致更新操作。

INSERT ON DUPLICATE KEY UPDATE批量插入:

insert into student ( id, name, email, city)
values
( 1, '小明', 'asasasasa', 'qw'),
( 1, '小王', 'asqww', qr'),
( 1, '小芳', 'asttyty', 'ds')
on duplicate key update
name = values(name),
city = values(city);

values(col_name)函数意思是,取出当前插入语句中col_name字段对应的值。values函数的参数是列名。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手刻 Deep Learning -第壹章-PyTorch入门教学-基础概念与再探线性回归

一、前言 本章会需要 微分、线性回归与矩阵的基本观念 这次我们要来做 PyTorch 的简单教学,我们先从简单的计算与自动导数( auto grad / 微分 )开始,使用优化器与误差计算,然后使用 PyTorch 做线性回归,还有…

office mac苹果办公软件安装包安装教程详解

软件下载 软件:mac office版本:2021语言:简体中文大小:4.27G安装环境:mac硬件要求:CPU2.0GHz 内存4G(或更高)下载通道 百度网盘 https://pan.baidu.com/s/1WGSB-icELUxweFkI8iIbzA 首先&#…

恒源云GPU使用tensorboard || 以OpenMMLab系列为例 || 定时复制可视化日志

序言 在训练过程中使用可视化工具向来是很有效的。相比于shell中的输出,可视化能够更好地向我们展现在训练过程中各项指标的变化。 但是,由于深度学习所需要的设备性能要求较高,我们常常使用云GPU进行训练。但是一些云平台的可视化工具让人摸…

2023国赛B题:多波束测线问题 评阅要点完整分析

本文所有分析仅代表个人观点,不代表官方,仅供参考 制作人:川川徒弟 demoo CSDN:川川菜鸟公众号:川川带你学AI 全文采用非编程做法  需要工具: geogebra、matlab工具箱   注: 本文全文不考虑…

02 java ---- Android 基础app开发

目录 相对布局 显示一个美女 显示两个美女 安卓APP启动过程 安卓布局控件 常用布局之相对布局 常用布局之相对布局 padding和margin 按键美化 常用布局之线性布局 安卓按键响应的几种方式 直接设置按键的onClick绑定的函数 自定义类实现按键监听事件的接口 匿名内…

字节一面:说说var、let、const之间的区别

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,熟练掌握js是我们的必备技能,var、let、const之间的区别我们也得熟练掌握,博主在这给大家细细道来。 &#x1f…

Linux驱动中断与时间篇——高精度定时器hrtimer

文章目录 前言相关接口使用示例单次定时循环定时 前言 低分辨率定时器是用jiffies来定时的,所以会受到HZ影响,如果HZ为200,代表每秒种产生200次中断,那一个jiffies就需要5毫秒,所以精度为5毫秒。 如果精度需要达到纳秒…

如何实现一个简单的Promise/A+规范的Promise库?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Promise/A规范的Promise⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚…

uni-app:通过ECharts实现数据可视化-如何引入项目

效果 引入文件位置 代码 <template><view id"myChart"></view> </template> <script> import echarts from /static/js/echarts.js // 引入文件 export default {mounted() {// 初始化EChartsconst myChart echarts.init(document…

【JVM 内存结构丨堆】

堆 定义内存分配特点:分代结构对象分配过程Full GC /Major GC 触发条件引用方式堆参数堆内存实例 主页传送门&#xff1a;&#x1f4c0; 传送 定义 JVM&#xff08;Java Virtual Machine&#xff09;堆是Java应用程序运行时内存管理的重要组成部分之一。堆内存用于存储Java对象…

如何区分和选择EML、DML两种激光器

EML&#xff08;External Cavity Laser&#xff09;和DML&#xff08;Distributed Feedback Laser&#xff09;两种激光器在光模块中都扮演着重要的角色&#xff0c;用于光通信和其他光电子应用。本文跟随易天光通信来了解一下它们在光模块中的应用吧&#xff01; 一、什么是E…

excel中的引用与查找函数篇3

1、INDEX(array,row_num,[col_num])&#xff1a;获取指定范围中指定行号和列号对应的数据 index(查询范围,行号,列号) 行号和列号是相对选中查询范围来写的&#xff1a;分别把第二行第三列的数据和第四行第二列的数据查找出来。 数据是单行或单列&#xff0c;后面只需要给一个参…

C【文件操作】

1. 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09;。 1.1 程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;,目标文件&#xff08;windows环…

Golang Array 数组使用注意事项和细节

在go数组当中&#xff0c;长度是数据类型的一部分 [3]int *[3]int 数组使用注意事项和细节 1) 数组是多个相同类型数据的组合&#xff0c;一个数组一旦声明/定义了&#xff0c;其长度是固定的&#xff0c;不能动态变化 var a [3]int a[0] 1.1 这样是不行的&#xff0c;必…

“对象创建”模式

通过“对象创建”模式绕开new&#xff0c;来避免对象创建 (new) 过程中所导致的紧耦合(依赖具体类)从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory MethodAbstract FactoryPrototypeBuilder Factory Method 动机 (Motivation) 在软件系统中&am…

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…

Day981.OAuth 2.0的工作流程与安全问题 -OAuth 2.0

OAuth 2.0的工作流程与安全问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于OAuth 2.0的工作流程与安全问题的内容。 一、OAuth 2.0 工作流程串讲 OAuth 2.0 是一种授权协议&#xff0c;这种协议可以让第三方软件代表用户去执行被允许的操作。 那么&#xff0c;…

HI_NAS linux 记录

dev/root 100% 占用解决记录 通过下面的命令查看各文件夹 大小 sudo du --max-depth1 -h # 统计当前文件夹下各个文件夹的大小显示为M 最终发现Var/log 占用很大空间 发现下面两个 log 占用空间很大&#xff0c;直接 rm-rf 即可 HI NAS python3 记录 # 安装pip3 sudo apt u…

4.后端·新建子模块与开发(传统模式)

文章目录 学习资料新建子模块与各层查询entity的列表entitymapper层service层controller层 测试 学习资料 https://www.bilibili.com/video/BV13g411Y7GS?p8&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e b站的学习视频 新建子模块与各层 在r…

Angular变更检测机制

前段时间遇到这样一个 bug&#xff0c;通过一个 click 事件跳转到一个新页面&#xff0c;新页面迟迟不加载&#xff1b; 经过多次测试发现&#xff0c;将鼠标移入某个 tab &#xff0c;页面就加载出来了。 举个例子&#xff0c;页面内容无法加载&#xff0c;但是将鼠标移入下图…