如何在MySQL中实现upsert:如果不存在则插入?

目录

1 使用 REPLACE

2 使用 INSERT ... ON DUPLICATE KEY UPDATE


使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或  字段 INSERT IGNORE 中重复值的语句 不会 产生错误,而只是完全忽略该特定 命令。其明显目的是 针对数据库中已存在的数据以及进入系统的新数据的组合 执行大量语句。

例如,我们的 books 表可能已经包含一些记录:

mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title                   | author              | year_published |
+----+-------------------------+---------------------+----------------+
|  1 | In Search of Lost Time  | Marcel Proust       |           1913 |
|  2 | Ulysses                 | James Joyce         |           1922 |
|  3 | Don Quixote             | Miguel de Cervantes |           1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)

如果我们有大量新数据和现有数据, INSERT 并且其中一部分数据包含字段的匹配值 id ( UNIQUE PRIMARY_KEY 表中的),则使用基本方法 INSERT 将产生预期的错误:

mysql> INSERT INTO books(id, title, author, year_published)
VALUES(1, 'Green Eggs and Ham''Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

另一方面,如果我们使用 INSERT IGNORE,则重复尝试将被忽略,并且不会发生任何错误:

mysql> INSERT IGNORE INTO books(id, title, author, year_published)
VALUES(1, 'Green Eggs and Ham''Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)

1 使用 REPLACE


如果您希望实际替换 由于重复 或  如上所述的值而 INSERT 导致命令产生错误的行 ,则一种选择是选择该 语句。UNIQUEPRIMARY KEYREPLACE

当发出 REPLACE 语句时,每个发出的命令都有两种可能的结果:

  • 未找到具有匹配值的现有数据行,因此 INSERT 执行标准语句。
  • 找到匹配的数据行,导致使用标准语句删除该现有行 ,然后 执行DELETE 正常操作 。INSERT

例如,我们可以使用  苏斯博士的《绿鸡蛋和火腿》REPLACE 替换掉  马塞尔·普鲁斯特的《 id = 1 追忆似水年华》的现有记录:

mysql> REPLACE INTO books(id, title, author, year_published)
VALUES(1, 'Green Eggs and Ham''Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)

请注意,尽管我们只改变了一行,但结果表明有  行受到了影响,因为我们实际上是 DELETED 用现有行 INSERTED 来替换它。

有关使用的更多信息, REPLACE 请参阅 官方文档。

2 使用 INSERT ... ON DUPLICATE KEY UPDATE


 对于可能包含重复或 值的INSERTING 行, 替代的(通常是首选的)方法  是使用  语句和子句。UNIQUEPRIMARY KEYINSERT ... ON DUPLICATE KEY UPDATE

与 REPLACE - 由于 DELETE 它在必要时执行的命令而具有固有的破坏性命令 - 使用 INSERT ... ON DUPLICATE KEY UPDATE 是非破坏性的,因为它只会发出 INSERT 或 UPDATE 语句,但绝不会 DELETE

例如,我们决定替换 “绿鸡蛋和火腿”id = 1 的记录  ,并将其恢复为原始的“ 追忆似水年华” 记录。因此,我们可以采用原始  语句并添加新  子句:INSERTON DUPLICATE KEY UPDATE

mysql> SET @id = 1,@title = 'In Search of Lost Time',@author = 'Marcel Proust',@year_published = 1913;
INSERT INTO books(id, title, author, year_published)
VALUES(@id@title@author@year_published)
ON DUPLICATE KEY UPDATEtitle = @title,author = @author,year_published = @year_published;

请注意,我们使用了正常 UPDATE 语法(但不包括不必要的 table 名称和 SET 关键字),并且只分配值 non-UNIQUE 。此外,尽管该方法不需要它们 ON DUPLICATE KEY UPDATE 才能正常运行,但我们也选择使用它们, user variables 这样我们就不需要  多次指定我们想要的INSERT 实际 值。UPDATE

结果,我们的 id = 1 记录正如 UPDATED 预期的那样:

mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title                  | author        | year_published |
+----+------------------------+---------------+----------------+
|  1 | In Search of Lost Time | Marcel Proust |           1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)

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

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

相关文章

CAN总线线束设计与节点布置

CAN总线线束设计与节点布置 设计和布置CAN总线线束时需要考虑的因素常见的 CAN 总线节点布置拓扑结构通过合理节点布置来提高 CAN 总线可靠性在布置 CAN 总线节点时,需要考虑以下几点设计和布置CAN总线线束时需要考虑的因素 在设计和布置CAN总线线束时,需要考虑以下几个因素…

[word] word大括号怎么打两行 #其他#其他#微信

word大括号怎么打两行 Word给用户提供了用于创建专业而优雅的文档工具,帮助用户节省时间,并得到优雅美观的结果。 一直以来,Microsoft Office Word 都是最流行的文字处理程序。 作为 Office 套件的核心程序, Word 提供了许多易…

秒杀优化+秒杀安全

1.Redis预减库存 1.OrderServiceImpl.java 问题分析 2.具体实现 SeckillController.java 1.实现InitializingBean接口的afterPropertiesSet方法,在bean初始化之后将库存信息加载到Redis /*** 系统初始化,将秒杀商品库存加载到redis中** throws Excepti…

golang之Slices操作示例(字符串数组)

1. 声明与长度判断 //字符串数组使用,也叫分片(Slices) var s1 []string fmt.Println("for s1:", s1, len(s1), cap(s1), s1 nil, len(s1) 0) if s1 nil {fmt.Println("空字符串数组(Slices)") } if len(s1) 0 {fmt.Println("字符串…

【YOLOv10】使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!

NVIDIA TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策…

平稳交付 20+ 医院,卓健科技基于 OpenCloudOS 的落地实践

导语:随着数字化转型于各个行业领域当中持续地深入推进,充当底层支撑的操作系统正发挥着愈发关键且重要的作用。卓健科技把 OpenCloudOS 当作首要的交付系统,达成了项目交付速度的提升、安全可靠性的增强、运维成本的降低。本文将会阐述卓健科…

【转】ES, 广告索引

思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…

gcc与g++的原理

程序的翻译 1 快速认识gcc/g2 程序翻译的过程2.1 预处理阶段2.2 编译阶段2.3 汇编阶段2.4 链接阶段 3 动静态库 1 快速认识gcc/g 首先我们需要在linux系统中安装对应的编译器gcc/g,安装命令如下(centos7环境下): gcc: yum instal…

什么是哈希冲突?如何解决哈希冲突?HashMap和TreeMap之间的区别?

Map 和 Set 的概念 Map和Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关 。 为什么说它是一种专门用来进行搜索的数据结构呢? 我们应该都用过“遍历查找”、“二分查找”,这两种方式也都是用来对目标…

Spring Security系列之PasswordEncoder

概述 任何一个登录系统的密码不能明文存储,万一发生数据库泄漏事故(不管是内部人员导出数据库数据还是被黑客攻击破解数据库实例节点拿到数据库数据等,又或者是其他情况造成的),将产生巨大的损失。因此明文密码在存储…

DOS 操作系统

DOS 介绍 DOS:disk operating system,磁盘操作系统。 中国DOS联盟下载 MS-DOS 7.10完整安装版(含图形安装程序) DOS 环境下的操作 输入部分内容后按下 Tab 可以快速自动补全。 按住 Ctrl 键可以用鼠标滚轮改变字号大小。 DO…

【数据结构初阶】--- 顺序表

顺序表,好像学C语言时从来没听过,实际上就是给数组穿了层衣服,本质是一模一样的。 这里的顺序表实际是定义了一个结构体,设计各种函数来实现它的功能,比如说数组中的增删改查插入,这些基本操作其实平时就会…

Log4j日志级别介绍

Log4j 是一个广泛使用的 Java 日志记录框架,提供了多种日志级别,用于控制日志输出的详细程度。每个日志级别代表一种特定的重要性和紧急程度。 以下是 Log4j 的常见日志级别及其解读: FATAL(致命) 解释:表…

【报错解决】深度学习模型训练时cuda内存足够但测试时反而报错cuda out of memory

报错描述 报错的代码如下: model reader(configargs, encoderencoder)#初始化模型 model.to(cuda)#把模型放到gpu上 model.load_state_dict(torch.load(join(args.checkpoint_path, best_ckpt_model1.pkl)))#加载模型参数 model torch.nn.DataParallel(model)#并…

c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK1120 6 个无法解析的外部命令 ConsoleApplication1 D:\vs_qt_project\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe 1 严重性 代码 说明 项目 文件 行 …

聊聊App在安卓设备中所使用的内存

文章用来记录及分享本人对安卓程序中内存使用的个人见解,如有不同见解 不吝赐教。 先简单浏览下面代码,看看对它们是否熟悉👇 val activityManager getSystemService(ACTIVITY_SERVICE) as ActivityManager// Java 堆内存信息val runtime R…

adb 脚本化Android系统截图和录屏

1、首先我们了解截图和录屏最基础的命令 手机录屏 adb shell screenrecord sdcard/Pictures/Screenshots/Record_xxx.mp4导出手机录屏 adb pull sdcard/Pictures/Screenshots/Record_xxx.mp4手机截屏 adb shell screencap /sdcard/Screenshots_xxx.png导出手机截屏 adb pu…

应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

应用层:之前我们写的创建套接字,发送数据,序列化反序列化这些都是在写应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 之前的网络计算机是我们自定义的协议:传输的数据最终是什么样的结…

Gnu/Linux 系统编程 - 如何获取帮助及一个演示

Gnu/Linux 系统编程 - 如何获取帮助及一个演示 今天开始写 Gnu/Linux 环境下的系统编程,主要的用的语言是 C,主要是为了学习 C 语言,边学边写,这样的学习速度是比较快的。 今天就先介绍下如何在手头上没有任何资料的情况下&…

windows11搭建 stable-diffusion-webui

2024年5月22日23:46:57 建议电脑配置 电脑配置: Intel Core™ Ultra 5 125H 1.20 GHz 32.0 GB (31.6 GB 可用) 系统:windows11 注意:最好挂上外网,或者设置好访问github的dns,不然很可能失败 1,安装 An…