MySQL的Replace用法详解

2023-05-16

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 intoinsert into 功能类似。

不同点在于:

insert into 最普遍的插入,如果表中存在主键相同的数据,执行会报错。

insert ignore 如果表中存在主键相同的数据不在插入该条数据,反之则插入(存在则忽略,反之插入)。

replace into 首先尝试插入数据到表中。

  1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。

  2. 否则,直接插入新数据。

注意:**插入数据的表必须有主键或者是唯一索引!**否则的话,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大厂开始反内卷,阿里和蚂蚁升级员工福利,打响第一枪

c1e6d14fd9d6ad00eafc1bc52cb5152b.png

快乐程序员、读书狂魔、爱撸代码、开源项目、硬核互联网技术分享

觉得写得不错,请点在看,谢谢!

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL的Replace用法详解 的相关文章

随机推荐

  • centos7 yum安装jdk8

    1 安装之前先检查一下系统有没有自带open jdk 命令 xff1a rpm qa grep java rpm qa grep jdk rpm qa grep gcj 如果没有输入信息表示没有安装 2 首先检索包含java的列表 yum
  • 【2021最新版】RabbitMQ面试题总结(32道题含答案解析)

    文章目录 1 什么是rabbitmq xff1f 2 为什么要使用rabbitmq xff1f 3 使用rabbitmq的场景 4 如何确保消息正确地发送至RabbitMQ xff1f 如何确保消息接收方消费了消息 xff1f 5 如何避免
  • 忘记mysql密码后如何修改密码(2022最新版详细教程保姆级)

    忘记mysql密码后如何修改密码 注意事项步骤 注意事项 一共用到两个cmd窗口 xff0c 每一个都要以管理员身份打开 xff0c 且在修改密码后 xff0c 要先关闭第一个跳过验证密码的mysql服务的cmd窗口 xff0c 再启动my
  • 忘记密码时如何修改mysql密码

    前言 近期学习j2ee开发时 xff0c 初步接触MySQL xff0c 偶然发现以往安装MySQL时修改的密码忘记 xff0c 于是查找资料学习了如何在忘记密码的情况下改变MySQL密码 以下为末学个人简介 xff0c 有不周之处 xff
  • 快速入手node.js

    目录 1 什么是 Node js 2 fs模块 3 path模块 4 http 模块 1 IP 地址 2 域名和域名服务器 3 端口号 4 创建 web 服务器的基本步骤 1 什么是 Node js Node js是让Javascript脱
  • 快速掌握 MyBatis 框架(二)

    文章目录 一 前言 1 1 数据库与表1 2 实体类1 3 MyBatisX 插件1 4 SQL 日志查看配置 二 多表查询 2 1 一对一2 2 一对多 三 动态 SQL 使用 3 1 lt if gt 标签3 2 lt trim gt
  • Cesium加载离线地图和离线地形

    文章目录 前言一 Cesium加载离线地图 1 1 下载数据2 2 数据处理2 3 地图发布2 4下载速度改进 二 Cesium加载离线地形 2 1 下载数据2 2 数据处理2 3 地形发布2 4 遇到的问题 前言 直接把地图数据切片 xf
  • Charles抓包显示<unknown>解决方案

    上篇 xff1a Charles抓包微信小程序数据 charles抓包会出现 xff0c 请求前都加了锁 xff0c 具体地址为的情况 解决问题 首先电脑上需要安装charles xff0c 然后需要设置手机上的WiFi设置 xff0c 修
  • Chrome 配置samesite=none方式

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言二 解决方案 1 方案一 xff1a 修改浏览器配置2 方案二 xff1a 使用Nginx3 方案三 xff1a 若服务器为
  • Chrome插件开发入门

    视频作者 xff1a 猿伙伴的个人空间 哔哩哔哩 bilibili 源码 xff1a https pan baidu com s 1EUOUo6QwHezyddmslyFsJQ 提取码 xff1a xtex 目录 一 第一个插件helloW
  • CISP-PTE真题演示

    周末帮好兄弟做PTE的真题 xff0c 觉得确实挺有意思的 xff0c 于是就有了这篇文章 xff0c 侵删侵删哈 第一阶段 基础题目一 xff1a SQL注入 所谓SQL注入 xff0c 就是通过把SQL命令插入到Web表单提交或输入域名
  • python循环性能pk

    python循环性能pk 在任何一种编程语言中 xff0c 循环都是非常消耗时间的操作 假设任意一种简单的单步操作耗费的时间是1个单位 xff0c 将此操作重复执行上万次 xff0c 最终耗费的时间也将增长上万倍 众所周知 xff0c py
  • Java程序员必读的入门&进阶书单

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img lZRiIYGZ 1659350372441 http static chayuqing com edddeb70713efa2da69e953240a5b3ab
  • Java程序员怎样进阶

    对于很多学习Java的程序员来说 xff0c 回过头来看入门Java的过程并不难 xff0c 反而是学到后期感觉没有进步 xff0c 尤其是对于一个进军编程界的两三年的Java程序员来说 xff0c 工作如果还只是增删改查 xff0c 这可
  • java程序员该如何进阶?这份java中高级核心知识全面解析请收好

    Java中高级核心知识全面解析 是整理收录GitHub50K 43 Star以上的高质量学习文档 xff0c 前前后后花了近半个月的时间 xff0c 终于整理而成 包含了Java基础 网络 Linux 数据结构与算法 数据库 系统设计 工具
  • MySQL的 DDL和DML和DQL的基本语法

    前言 SQL语句 xff0c 即结构化查询语言 Structured Query Language xff0c 是一种特殊目的的编程语言 xff0c 是一种数据库查询和程序设计语言 xff0c 用于存取数据以及查询 更新和管理关系数据库系统
  • MySQL的10种常用数据类型

    MySQL的数据类型 常用的数据类型有 xff1a 整型 xff08 xxxint xff09 位类型 bit 浮点型 xff08 float和double real xff09 定点数 xff08 decimal numeric xff0
  • MySQL的DATE_FORMAT()函数将Date转为字符串

    一 前言 最近要做一些报表 xff0c 其中有一个创建报表的时间 xff0c 需要以固定的格式输出 xff1b 那么在SQL层面如何处理呢 xff1f 二 DATE FORMAT 函数 要将日期值格式化为特定格式 xff0c 可以使用DAT
  • MySQL的on duplicate key update 的使用

    mysql的存在就更新不存在就插入实现 先建数据库表 xff0c 重点要添加主键索引 xff08 id列 xff0c 没有测试 xff09 和唯一索引 xff08 branch no列 xff09 xff0c 随便找表测试 INSERT I
  • MySQL的Replace用法详解

    replace into平时在开发中很少用到 xff0c 这次是因为在做一个生成分布式ID的开源项目 xff0c 调研雅虎推出的一个基于数据库生成唯一id生成方案 xff1a flickr 碰到的一个知识盲点 xff0c 仅以此篇记录一下