MySQL replace into那些隐藏的风险
MySQL中 replace into是否像预期样:若表中有已经存在的数据,则把已经存在的数据删除,插入新数据?
准备数据
CREATE TABLE `test_replace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`str1` char(10) DEFAULT NULL,
`str2` char(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uqx_str` (`str1`)
) ENGINE=InnoDB;
insert into test_replace(id,str1,str2) values(2,1234,'aaabbbb'),(4,123456,'bbbbxxxx');
select * from test_replace;
+----+--------+----------+
| id | str1 | str2 |
+----+--------+----------+
| 2 | 1234 | aaabbbb |
| 4 | 123456 | bbbbxxxx |
+----+--------+----------+
2 rows in set (0.00 sec)
replace into时存在主键冲突
replace into test_replace(id,str1,str2) values(2,'xxxx','yyy');
Query OK, 2 rows affected (0.00 sec)
select * from test_replace;
+----+--------+----------+
| id | str1 | str2 |
+----+--------+----------+
| 2 | xxxx | yyy |
| 4 | 123456 | bbbbxxxx |
+----+--------+----------+
binlog中记录内容

replace into时存在唯一索引冲突
replace into test_replace(id,str1,str2) values(8,'xxxx','ppppp');
Query OK, 2 rows affected (0.01 sec)
select * from test_replace;
+----+--------+----------+
| id | str1 | str2 |
+----+--------+----------+
| 4 | 123456 | bbbbxxxx |
| 8 | xxxx | ppppp |
+----+--------+----------+
show create table `test_replace`\G
*************************** 1. row ***************************
Table: test_replace
Create Table: CREATE TABLE `test_replace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`str1` char(10) DEFAULT NULL,
`str2` char(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uqx_str` (`str1`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
###下一次插入非冲突数据时自增主键为9
binlog中记录内容

replace into时存在主键冲突&唯一索引冲突
replace into test_replace(id,str1,str2) values(8,'123456','主键和唯一索引冲
突');
Query OK, 3 rows affected (0.01 sec)
####插入了这条数据后,原来的两条数据(主键4,8)变成了一条(主键 8),数据丢失!!!
select * from test_replace;
+----+--------+-----------------------------+
| id | str1 | str2 |
+----+--------+-----------------------------+
| 8 | 123456 | 主键和唯一索引冲突 |
+----+--------+-----------------------------+
show create table test_replace\G
*************************** 1. row ***************************
Table: test_replace
Create Table: CREATE TABLE `test_replace` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`str1` char(10) DEFAULT NULL,
`str2` char(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uqx_str` (`str1`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
binlog中记录内容

存在问题
场景2:
- replace into时存在唯一索引冲突:会把冲突数据删掉,插入新数据,但binlog中记录的是update格式,从库同步update binlog不会更新该表的自增主键,主库自增主键9,从库自增主键8,若主从库角色发生切换后,新主库会存在主键冲突问题
- replace into唯一索引冲突会导致下游大数据hive(同步binlog写入hive中)中数据和mysql中数据不一致问题(hive基于唯一主键进行处理,mysql一条数据,hive中多条数据情况)
场景3:
- replace into时存在主键冲突&唯一索引冲突:会把表中主键冲突和唯一索引冲突的数据都删掉,再插入新数据,丢失一条数据
经验证:mysql5.7 和mysql8.0均是上诉情况
结论
replace into在只存在主键冲突时会按预期的那样;若只有唯一索引冲突时 主从切换后导致新主库主键冲突错误、下游大数据数据不一致问题;同时存在主键冲突和唯一索引冲突可能会导致丢失数据。业务上不应使用replace into,应该在代码对唯一数据冲突作处理
MySQL replace into那些隐藏的风险的更多相关文章
- MySQL replace into 使用详解 及 注意事项
REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除.注意:除非表 ...
- MySQL replace函数替换字符串语句的用法(mysql字符串替换)
MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪. 最近在研究CMS,在数据转换的时候需要用 ...
- MySQL "replace into" 的坑
MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后会有性能问题,还会有一些意料之外的副作用,比如 REPLACE INTO. 比如有这样一张表: CREATE TABLE `au ...
- MySQL replace into 说明(insert into 增强版)
MySQL replace into 说明(insert into 增强版) 在插入数据到一个表时,通常是这种情况:1. 先推断数据是否存在: 2. 假设不存在,则插入:3.假设存在,则更新. 在 S ...
- MySQL replace into (insert into 的增强版)
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for ke ...
- mysql replace into 的使用情况
replace into的存在的几种情况 当表存在主键并且存在唯一键的时候 如果只是主键冲突 mysql> select * from auto; +----+---+------+------ ...
- 细说mysql replace into
replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数 ...
- Mysql replace into
mysqlsql serverinsert 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果存在,则更新. 在 SQL Server 中可以 ...
- MySQL "replace into" 的坑以及insert相关操作
下面我们主要说一下在插入时候的几种情况: 1:insert ignore 2:replace into 3:ON DUPLICATE KEY UPDATE 关于insert ignore: 关于rep ...
随机推荐
- Spark为什么只有在调用action时才会触发任务执行呢(附算子优化和使用示例)?
Spark算子主要划分为两类:transformation和action,并且只有action算子触发的时候才会真正执行任务.还记得之前的文章<Spark RDD详解>中提到,Spark ...
- requests库响应消息体的四种格式
1.r.text 文本响应内容,返回字符串类型,获取网页html时用: 2.r.content 字节响应内容,返回字节类型,下载图片或者文件时用: 3.r.json json解码响应内容,返回字典 ...
- python中使用with操作文件,为什么不需要手动关闭?
python中的with关键字,它是用来启动一个对象的上下文管理器的.它的原理是,当我们使用with去通过open打开文件的时候,它会触发文件对象的上下文管理器, 当with中的代码结束完成之后,去自 ...
- @Transactional 注意事项、方法调用
1.同一个类中,即A与B在同一类中,A()调用B()方法,A不加 @Transactional 事务注解,B加 @Transactional 事务注解,则B中的事务不起作用,A加事务,才会起作用,B中 ...
- 正式班D21
2020.11.03星期二 正式班D21 目录 11.5 源码包 11.5.1 预先安装编译安装依赖的库 11.5.2 官网下载源码包 11.5.3 解压.编译.编译安装 11.5 源码包 11.5. ...
- [Luogu P2278] [HNOI2003]操作系统
题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ...
- SQL 速查表
关系数据库,基于关系模型,使用关系(表)存储数据,同时定义了完整性约束.常见的关系数据库系统包括:Oracle.MySQL/MariaDB.SQL Server.PostgreSQL 等等. SQL, ...
- OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...
- yum安装出现被锁定的报错
问题:在使用#yum install XXX 命令的时候,出现yum.pid 已被锁定的提示,无法进行yum 安装 解决: 使用# rm -f /var/run/yum.pid 命令删除该进程即可
- C的输入&输出
格式说明符 输出 %d整型输出,%ld长整型输出, %o以八进制数形式输出整数, %x以十六进制数形式输出整数,或输出字符串的地址. %u以十进制数输出unsigned型数据(无符号数).注意:%d与 ...