当前位置:网站首页>MySQL的Replace用法详解
MySQL的Replace用法详解
2022-07-30 20:14:00 【iijik55】
replace into平时在开发中很少用到,这次是因为在做一个生成分布式ID的开源项目,调研雅虎推出的一个基于数据库生成唯一id生成方案:flickr 碰到的一个知识盲点,仅以此篇记录一下。
一、replace into函数
表结构
CREATE TABLE `id_generator` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`stub` char(1) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM;
id
列是主键索引,stub
列是唯一索引 。
replace into
向数据库中插入数据时,如果数据重复,则删除重复的那行数据,然后在插入一行。
replace具备替换拥有唯一索引或者主键索引重复数据的能力,也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况,将会删除原先的数据,然后再进行添加。
那怎么判断是否重复的标准就是:唯一索引或者主键索引是否一致。语法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
语义:向table表中col1, col2, col3列replace数据val1,val2,val3
以id_generator
表为例:
REPLACE INTO id_generator(stub) VALUES ('trade')
执行信息如下:
No errors; 1 rows affected, taking 20ms
表示只添加了一行。
执行结果:
+----+--------------+
| id | stub |
+----+--------------+
| 1 | trade |
+----+--------------+
接续执行如下语句:
REPLACE INTO id_generator(stub) VALUES ('trade')
执行信息如下:
No errors; 2 rows affected, taking 23ms
因为删除了一行,添加了一行。
执行结果:
+----+--------------+
| id | stub |
+----+--------------+
| 3 | trade |
+----+--------------+
因为stub
列创建列唯一索引,所以replace into
当stub有重复的数据行时,会删除这行数据重新添加,导致id发生变化。
如果replace into
唯一索引 id
重复的话,会怎么样呢?
REPLACE INTO id_generator(id) VALUES (3)
执行信息如下:
No errors; 2 rows affected, taking 28ms
因为删除了一行,添加了一行。
执行结果:
+----+--------------+
| id | stub |
+----+--------------+
| 3 | |
+----+--------------+
这时我们看到stub
列的值为空字符串,因为id是唯一索引,id=3的记录已经存在,所以replace into
会删除id=3的记录,重新添加,导致stub为空。
二、replace into 、insert ignore 和 insert into的区别
replace into
跟 insert into
功能类似。
不同点在于:
insert into
最普遍的插入,如果表中存在主键相同的数据,执行会报错。
insert ignore
如果表中存在主键相同的数据不在插入该条数据,反之则插入(存在则忽略,反之插入)。
replace into
首先尝试插入数据到表中。
如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
否则,直接插入新数据。
注意:**插入数据的表必须有主键或者是唯一索引!**否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据
三、replace函数
语法:replace(field,search,replace)
说明:field - 数据库表的列名
search - 需要替换的字符串
replace - 替换成的字符串
语义:将列名:field 中出现的search字符串,全部替换成replace字符串。
实例:
update id_generator set stub = replace(stub,'trade','user')
select replace(uuid(), '-', '');
****往期阅读
Kafka Producer全流程分析和思考
中国程序员多不多?
卷不动了,我选择降薪去外企来平衡工作和生活
HBase、Cassandra、LevelDB、RocksDB 相关数据结构是什么?
从Log4j2原理、攻击和解决方案来聊聊全球性的Log4j2漏洞
2022大厂开始反内卷,阿里和蚂蚁升级员工福利,打响第一枪
快乐程序员、读书狂魔、爱撸代码、开源项目、硬核互联网技术分享
觉得写得不错,请点在看,谢谢!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 推荐系统:评估指标【离线评估指标:RMSE(均方根误差)、AUC、准确率、召回率、F1】【在线评估:A/B测试】【一般要求响应时间<0.5s】
- PR视频剪辑软件教程
- Recommender systems: overview of the characteristics of architecture: user/item engineering -- -- -- -- -- -- -- -- > recall layer > sort layer - > test/evaluation 】 【 cold start problems, real-time 】
- HMS Core Discovery第16期回顾|与虎墩一起,玩转AI新“声”态
- 历史上的今天:Win10 七周年;微软和雅虎的搜索协议;微软发行 NT 4.0
- 基于人脸的常见表情识别(2)——数据获取与整理
- 推荐系统-模型:FNN模型(FM+MLP=FNN)
- OSS simply upload pictures
- 【请教】SQL语句按列1去重来计算列2之和?
- 并发与并行的区别
猜你喜欢
随机推荐
MySQL database master-slave configuration
Mapped Statements collection does not contain value for的解决方法
PHP低代码开发引擎—表单设计
To the operation of the int variable assignment is atom?
Recommender systems: overview of the characteristics of architecture: user/item engineering -- -- -- -- -- -- -- -- > recall layer > sort layer - > test/evaluation 】 【 cold start problems, real-time 】
Mac安装PHP开发环境
是对称矩阵的对角化
HarmonyOS笔记-----------(三)
明解C语言第七章习题
[NISACTF 2022]下
如何优化OpenSumi终端性能?
Recommendation System - Sorting Layer - Model (1): Embedding + MLP (Multilayer Perceptron) Model [Deep Crossing Model: Classic Embedding + MLP Model Structure]
FFmpeg —— 将mp4转为gif输出(附源码)
360杜跃进:太空安全风险加剧,需打造一体化防御体系
el-input can only input integers (including positive numbers, negative numbers, 0) or only integers (including positive numbers, negative numbers, 0) and decimals
Redisson 的分布式锁找不到?
TensorFlow2:概述
用jOOQ 3.17投射类型安全的嵌套表记录
化二次型为标准型
Typora设置标题自动标号