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

我们日常使用 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.rhkb.cn/news/18161.html

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

相关文章

日语发音的节拍

短音 每个假名(包括清音、浊音、半浊音)都占 1 拍。 长音 长音占 2 拍,发音时间比短音长 不同母音的长音形式不同(あ段あ,い段い,う段う,え段い/え,お段う/お) 促音 …

[AI]从零开始的llama.cpp部署与DeepSeek格式转换、量化、运行教程

一、前言 在上一次的DeepSeek的部署教程中,我们使用Ollama与LM Studio很轻松的部署了DeepSeek并且也完成了相关API的调用,如果还有不会的小伙伴请看下面的教程: DeepSeek本地部署:[AI]从零开始的DeepSeek本地部署及本地API调用教…

基于SSM+uniapp的数学辅导小程序+LW示例参考

1.项目介绍 系统角色:管理员、普通用户功能模块:用户管理、学习中心、知识分类管理、学习周报管理、口算练习管理、试题管理、考试管理、错题本等技术选型:SSM,Vue(后端管理web),uniapp等测试环…

解决DeepSeek服务器繁忙问题

目录 解决DeepSeek服务器繁忙问题 一、用户端即时优化方案 二、高级技术方案 三、替代方案与平替工具(最推荐简单好用) 四、系统层建议与官方动态 用加速器本地部署DeepSeek 使用加速器本地部署DeepSeek的完整指南 一、核心原理与工具选择 二、…

B+Tree在mysql中的使用

BTree的结构 BTree是B-Tree的变种,实际结构如图 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据 BTree的特点 所有…

vue学习10

1.GPT和Copilot Copilot Tab接受 删除键,不接受 ctrlenter更多方案 更适合的是修改方向 const submitForm async () > {//等待校验结果await formRef.value.validate()//提交修改await userUpdateInfoService(form.value)//通知user模块,进行数据更…

我的新书《青少年Python趣学编程(微课视频版)》出版了!

🎉 激动人心的时刻来临啦! 🎉 小伙伴们久等了,我的第一本新书 《青少年Python趣学编程(微课视频版)》 正式出版啦! 📚✨ 在这个AI时代,市面上的Python书籍常常过于枯燥&…

总结:如何在SpringBoot中使用https协议以及自签证书?

总结:如何在SpringBoot中使用https协议以及自签证书? 前提一:什么是http协议?前提二:什么是https协议?一生成自签证书二 将证书转换为PKCS12格式三 配置SpringBoot(1)修改配置文件&a…

JAVA毕业设计212—基于Java+Springboot+vue3的校园运动场馆预约管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的校园运动场馆预约管理系统(源代码数据库)212 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为用户、管理员两种角色 1、用户&#xff…

在nodejs中使用RabbitMQ(六)sharding消息分片

RabbitMQ 的分片插件(rabbitmq_sharding)允许将消息分布到多个队列中,这在消息量很大或处理速度要求高的情况下非常有用。分片功能通过将消息拆分到多个队列中来平衡负载,从而提升消息处理的吞吐量和可靠性。它能够在多个队列之间…

数据结构 二叉树

一、⼆叉树的定义 ⼆叉树是⼀种特殊的树型结构,它的特点是每个结点⾄多只有2棵⼦树(即⼆叉树中不存在度⼤于2的结点),并且⼆叉树的⼦树有左右之分,其次序不能任意颠倒。 ⼆叉的意思是这种树的每⼀个结点最多只有两个孩…

本地部署DeepSeek集成VSCode创建自己的AI助手

文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型(deepseek-r1:1.5b)下载自动补全模型(deepseek-coder:1.3b) 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…

【NLP】循环神经网络RNN

目录 一、词嵌入层 二、循环网络层 2.1 RNN网络原理 2.2 Pytorch RNN API 自然语言处理(Nature language Processing,NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言&#xf…

利用蓝耘智算平台深度搭建deepseek R1模型,进行深度机器学习

大佬请阅读 前言关于DeepSeek 的显著优点卓越的性能表现低廉的训练成本广泛的应用场景开放的开源策略 DeepSeek 与其他 AI 对比什么是蓝耘智算平台为什么使用蓝耘智算平台搭建我们的deepseek如何使用蓝耘 GPU 智算云平台搭建我们的R1模型并成功进行调用测试11. AVL树节点结构2.…

spring6(完结)

像是八大模式这种,放在后面八股文中再重点了解,对于源码部分也是后面会一起手敲。 个人觉得spring的重点在于注解开发,省去了很多耦合的问题,像是各种事务的管理,和bean类的管理都可以给spring容器管理,注入…

H5自适应响应式代理记账与财政咨询服务类PbootCMS网站模板 – HTML5财务会计类网站源码下载

(H5自适应)响应式代理记账财政咨询服务类pbootcms网站模板 html5财务会计类网站源码下载 为了提升系统安全,请将后台文件admin.php的文件名修改一下。修改之后,后台登录地址就是:您的域名/您修改的文件名.php 模板特点: 1&#x…

Java 大视界 -- 量子计算时代 Java 大数据的潜在变革与应对策略(88)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

[css] 黑白主题切换

link动态引入 类名切换 css滤镜 var 类名切换 v-bind css预处理器mixin类名切换 【前端知识分享】CSS主题切换方案

基于Ceedling的嵌入式软件单元测试

Ceedling 如果你使用 Ceedling(一个针对 C 代码单元测试的构建管理器),可以更方便地管理测试。Ceedling 会自动处理 Unity 和 CMock 的集成,无需手动编写 Makefile。 1.环境搭建 1.1 Ruby环境 sudo apt-get install ruby1.2 安…

Renesas RH850 FDL库集成步骤

文章目录 1. 获取并解压FDL库文件2. 将FDL库文件添加到工程3. 配置工程编译选项4. 配置运行时参数5. 集成API调用到应用程序6. 处理多任务与中断7. 验证与调试常见问题与解决方案总结1. 获取并解压FDL库文件 下载途径:从Renesas官网或提供的安装包获取FDL库(如 RENESAS_FDL_R…