MySQL中Replace语句用法实例详解
作者:ixxqq 发布时间:2024-01-15 03:26:28
前言
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(), '-', '');
附:Mysql中的replace into跟insert into用法类似
INSERT :会每次插入一条新的数据。
REPLACE:先看表中是否存在此条数据,如果存在,先删除该条数据,再插入一条新的数据;如果不存在,则直接插入一条新的数据
重点:
根据表中的主键或唯一索引来判断,如果表中没有主键或唯一索引,那么REPLACE INTO 就相当于 INSERT
INTO,会直接插入一条数据。
来源:https://blog.csdn.net/xixiqiuqiu/article/details/122806694


猜你喜欢
- 目录前期准备界面编写截图功能实现OCR实现内容显示总结前期准备在这个阶段主要准备整个小程序的结构,既然要实现ocr,那么输入就是一张图片,而
- 概率论啊概率论,差不多忘完了。基于概率论的分类方法:朴素贝叶斯1. 概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称
- 本系列教程我们将使用python实现一些简单的测试工具,为了尽可能的简单,我们的工具以命令行工具为主。本系列教程使用的python版本是3.
- Python 是由吉多·范罗苏姆(Guido Van Rossum)在 90 年代早期设计。 它是如今最常用的编程语言之一。它的语法简洁且优
- 1、从半年以前要“去中心化”开始,豆瓣作了不少大的调整,重要的是上线了很多的新功能。同城、日记、相册、音乐试听、等等。2、一个多月来,豆瓣上
- 今天在设置input的readonly属性遇到问题,上网查到下面的内容,作个标记。今天系统需要使用javascript 动态设置textbo
- A Process Control System 使用b/s架构、运行在类Unix系统上一个进程监控管理系统它可以使进程以daemon方式运
- canny边缘检测原理canny边缘检测共有5部分组成,下边我会分别来介绍。1 高斯模糊(略)2 计算梯度幅值和方向。可选用的模板:sobl
- 本文讲述了提高代码可读性的十大注释技巧。分享给大家供大家参考,具体如下:很多程序员在写代码的时候往往都不注意代码的可读性,让别人在阅读代码时
- 配置要求:IIS(win2000 server 自带)、Java 2 SDK 1.4.2 (或更高版本)、Tomcat Web Server
- 在许多网页中,当鼠标移到一张图片上时,又弹出另一张图片,做这种广告条,要用到Macromedia DreamWeaver中的Lay
- 本文实例为大家分享了js实现简易计算器的具体代码,供大家参考,具体内容如下最近,博主闲来无聊,就没事用js写了个简易计算器(博主是搞后端的,
- 酝酿了将近一个春夏秋冬的腾讯网首页终于亮剑!反响热烈!让我们来分享它成功背后的酸甜苦辣吧。腾讯网首页改版终于开花结果。于2008年3月25日
- (1)安装Jpype 用Python调用jar包需要安装jpype扩展,在Ubuntu上可以直接使用apt-get安装jpype扩展$ su
- 设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 Backup Database [数据库] To disk=&
- 首先我们放出tf2.0关于tf.keras.layers.Conv2D()函数的官方文档,然后逐一对每个参数的含义和用法进行解释:tf.ke
- 本文实例分析了Go语言中关闭带缓冲区的频道。分享给大家供大家参考。具体分析如下:Go语言提供了两种频道,带缓冲区和不带缓冲区的。不带缓冲区的
- 具体代码如下所述:__author__ = 'Yue Qingxuan'# -*- coding: utf-8 -*-#求质
- 摘要在这篇文章里,我将以反模式的角度来直接讨论Django的低级ORM查询方法的使用。作为一种替代方式,我们需要在包含业务逻辑的
- python代码 # -*- coding: utf-8 -*- import Image,ImageDraw,Imag