MySQL 插入替换语句(replace into statement)

news/2025/2/15 23:16:44/

我们日常使用 insert into 语句向表中插入数据时,一定遇到过主键或唯一索引冲突的情况,MySQL的反应是报错并停止执行后续的语句,而replace into语句可以实现强制插入。

文章目录

  • 一、replace into 语句简介
    • 1.1 基本用法
    • 1.2 使用set语句
  • 二、注意事项
    • 2.1 替换时必须要有主键或唯一索引
    • 2.2 替换时无法引用旧行的数据

一、replace into 语句简介

insert into语句在插入数据时如果遇到主键或唯一键冲突时,其反应是报错并返回。而如果你想强制插入,即遇到键值冲突时使用最新的数据替换原数据,则可以用replace into来代替insert into语句。

1.1 基本用法

先创建一张测试表,并插入2条数据:

create table mytab(
id int not null auto_increment primary key,
source varchar(16),
value int default 999);insert into mytab values(1, 'insert', 100),(2,'insert', 200);
table mytab;

在这里插入图片描述

下面用insert into语句插入2条数据,这里主键id=2出现了冲突,语句会执行失败:

insert into mytab values(2, 'insert', 200), (3, 'insert', 300);
table mytab;

在这里插入图片描述

将insert关键字替换为replace,当出现主键或唯一键冲突时,MySQL会先将表中冲突的数据删除,然后再插入,即隐式的帮你做了一个delete操作:

replace into mytab values(2, 'replace', 200), (3, 'replace', 300);
table mytab;

在这里插入图片描述
这里插入了2行数据,但是返回结果显示 3 rows affected,即是删除了1行,插入2行,共影响3行数据。同时Duplicates:1,显示有1行数据出现了重复。

1.2 使用set语句

replace into 还可以set语句用来指定每个列的值,这里更新id为1的行:

replace into mytab set id=1, source='set', value=101;
table mytab;

在这里插入图片描述

对于set中未指定的列,会被替换为默认值(这里不指定value的值,则其被设置成默认值999):

replace into mytab set id=1, source='set';
table mytab;

在这里插入图片描述

二、注意事项

2.1 替换时必须要有主键或唯一索引

replace into 发生替换时必须要检测到主键或唯一索引冲突,否则它的行为就和普通的insert into相同,我想把id为1的行value值设置为100,但仅引用source列,而通过source列无法判定冲突:

replace into mytab set source='set', value=100;
table mytab;

在这里插入图片描述
所以最终语句并没有像我预想的那样发生替换,而是插入了一行新数据。

2.2 替换时无法引用旧行的数据

如果我想在发生冲突时在原数据的基础上进行更新,这种场景replace into语句是无法做到的,因为在插入发生之前旧数据已经被删除了,所以是无法引用旧数据的,这里尝试将id=2的数据value值+1:

replace into mytab set id=2, source='plus 1', value=value+1;
table mytab;

在这里插入图片描述
可以看到最终结果并不是预想的201,而是1000。这是因为value=value+1,运算时无法引用旧值,而是引用了默认值。如果想实现冲突时在原数据上更新的效果,可以通过insert into … on duplcate key update语句实现。

最后提一句,replace into语句是MySQL对标准SQL的扩展,在其他RDBMS中可能并不适用。


http://www.ppmy.cn/news/1572370.html

相关文章

08模拟法 + 技巧 + 数学 + 缓存(D2_技巧)

目录 1. 只出现一次的数字(简单) 1.1. 题目描述 1.2. 解题思路 方法一:位运算 2. 多数元素(简单) 2.1. 题目描述 2.2. 解题思路 方法一:哈希表 方法二:排序 方法三:随机化 …

Windows 字体导入到 Docker 指定容器

以下是将 Windows 字体导入到 Docker 指定容器的详细操作步骤: 1. 准备工作 确认字体文件:在 Windows 系统中,字体文件通常位于 C:\Windows\Fonts 目录下。你可以选择需要导入的字体文件,常见的字体文件格式有 .ttf(…

【鸿蒙Next】优秀鸿蒙博客集锦

鸿蒙基础开发:多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客

haproxy+nginx负载均衡实验

准备三台虚拟机: HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器(192.168.65.131)上操作: 安装 HAProxy: sudo yum install -y haproxy编辑 HAProxy 配置…

通过服务器的 BMC(基板管理控制器)安装操作系统

一、BMC 安装操作系统的优势 无需物理接触服务器:通过带外管理(Out-of-Band)远程控制。支持虚拟介质挂载:直接从本地电脑上传ISO镜像到服务器。实时监控硬件状态:安装过程中可查看硬件日志、温度、电源等信息。二、准…

2024问题总结

20241225 XlVirtualList解决数据量大,滚动后,再点下拉会出现空白 setTimeout(() > { document.querySelector(.vxe-table--body).style.marginTop 0 }) 20241224双向数据绑定问题 加key是否已有这个元素$set慢半拍加$nextTick :key"isPlan?scope.row.dblamount:null&…

Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask

基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…

本地生活服务平台(源码+文档+部署+讲解)

引言 随着城市化进程的加速,本地生活服务的需求日益多样化和个性化。本地生活服务平台通过数字化手段,为社区居民提供了一个全面、便捷的服务体验,从而提升社区服务体验和生活质量。 系统概述 本地生活服务平台采用前后端分离的架构设计&a…