delete语句与reference约束冲突怎么解决_mysql update语句和原数据一样会更新么
戳蓝字「TopCoder」关注我们哦!
平常使用 mysql ,必不可少的会用到 update 语句,不知道小伙伴有没有这样的疑问?
如果 update 语句和原数据一样会更新么?更具体的来说,如果更新的数据前后是一样的,MySQL 会更新存储引擎中(磁盘)数据么?
关于这个问题,在分析之前我们可以思考下:update语句和原数据一样,有必要更新么?理论上来讲是没有必要的。MySQL Server 层在执行 sql 时,其实是不知道是否是一样的,因此可以猜想,如果 MySQL 已经知道原数据的话,这样可以和 update 语句做对比,这样一样的话可以不用更新了。
那么 MySQL 在执行update 语句时,什么时候会读取原数据呢?这就涉及到 binlog 的数据格式,binlog 数据格式相关配置项为binlog_format
,该配置取值范围如下:
statement:逻辑SQL格式,通过mysqlbinlog工具可进行查看,就是sql语句;
row:记录的是行更改日志,对于statement格式binlog复制潜在的问题可通过row来解决;
mixed:默认使用statement格式,某些操作下使用row格式,比如uuid/now/user等不确定函数。
注意:在msyql 5.1版本之前默认都是基于sql语句(statement)级别的,statement格式的binlog会造成某些操作在主从复制时出现问题,比如now/rand/uuid等。
row 格式的 binlog 会记录镜像数据,针对 update 来说,必须是前镜像数据才能判断出来update 语句是否和原数据一样。针对 row 格式的镜像数据配置,由配置项binlog_row_image
来决定(该配置只在 row 模式下才起作用),该配置项官方文档如下:
full: Log all columns in both the before image and the after image.
minimal: Log only those columns in the before image that are required to identify the row to be changed; log only those columns in the after image where a value was specified by the SQL statement, or generated by auto-increment.
noblob: Log all columns (same as full), except for BLOB and TEXT columns that are not required to identify rows, or that have not changed.
简单来说,full会记录所有列,noblob会记录除blob和text外的所有列,minimal只会记录需要的列。对于insert 来说,只有后镜像没有前镜像;对于update来说,有前镜像和后镜像;对于delete来说,只有前镜像没有后镜像。对于 full 和 noblob 没有什么好说的,对于minimal来说,insert 记录所有列后镜像,update 和 delete的话要分为几种情况:
当存在主键索引或者唯一索引时,update记录主键列前镜像和更新列后镜像,delete 记录主键列前镜像。
只有普通二级索引时,update 记录所有列前镜像和更新列后镜像,delete 记录所有列前镜像。
针对minimal的binlog_row_image为什么要这么设计呢?有主键或者唯一键的话,可以通过其定位到唯一一条记录,因此没有必要记录整个列的镜像数据了,在只有二级索引或者其他情况下,只能记录整个列的镜像数据。
那么日常开发中,应该怎么配置binlog_row_image呢?建议配置成 full 模式,因为这样可以以空间换取更多的数据保证,可以避免binlog 的闪回功能。
回到最初提到的问题,可以知道,在binlog_format=row时,由于MySQL 需要在 binlog 里面记录数据对应字段,因此会进行数据的读取操作,此时就可以进行数据对比,重复数据的update不会执行。具体验证可以通过以下几个命令:
show master status\Gset binlog_format ='row'; // statementshow variables like 'binlog_format';update xxx
针对 uddate 语句和原数据一样时可能不会进行更新操作,因此该场景下返回的影响行数可能为0。
推荐阅读
CompletableFuture 应用实践
Java线程池实现原理
深入理解Java线程池
JMM Java内存模型
happens-before那些事儿
为什么说LockSupport是Java并发的基石?
delete语句与reference约束冲突怎么解决_mysql update语句和原数据一样会更新么相关推荐
- delete语句与reference约束冲突怎么解决_一条简单的更新语句,MySQL是如何加锁的?...
看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10: MySQL在执行的过程中,是如何加锁呢?在看 ...
- Hibernate级联删除提示约束失败DELETE 语句与 REFERENCE 约束FK_SelectCourse_StudentInfo冲突。...
前台执行删除带约束关系的时候,后台提示错误 Hibernate: delete from Student.dbo.StudentInfo where Snu=? 删除失败! org.hibernate ...
- 【牛腩】DELETE 语句与 REFERENCE 约束“FK_news_category“冲突。该冲突发生于数据库“newssystem“,表“dbo.news“, column ‘caId‘
[前言] 牛腩中删除类别的时候会提示受到主外键的约束,导致无法删除这个类别. [问题描述] DELETE 语句与 REFERENCE 约束"FK_news_category"冲突. ...
- 删除作业计划出错(DELETE语句与 REFERENCE约束FK_subplan_job_id冲突。)
删除作业计划出错 提示:DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突. 解决方案: --打开SQL查询, use msdb select * ...
- 【数据库】ALTER TABLE 语句与 CHECK 约束““冲突。该冲突发生于数据库““,表““, column ‘‘
摘要:微信搜索[三桥君] 本篇讲述的是在已经创建好表且有数据的情况下,增加CHECK约束的报错问题 一.问题 当我给数据库中已经创建好的Student表,增加约束条件. --增加student表的约束 ...
- mysql更新代码_mysql update语句的用法
1. 单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 .. ...
- mysql update用法_mysql update语句的用法详解
首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] ...
- mysql更新语句用法_MySQL update 语句的正确用法
以下的文章主要介绍的MySQL update 语句的实际用法,我们首先是以单表的UPDATE语句来引出实现MySQL update 语句的实际方案,以下就是文章的详细内容描述,望你看完之后会有收获. ...
- mysql的更新用法_mysql update语句的用法详解
本节内容: mysql数据库中的update语句. 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr ...
最新文章
- 自己写编译器学习总结
- Node.Js从零开始搭建数据管理后台 (一)
- jQuery如何使用css方法修改单个样式?
- python观察日志(part15)--命名元祖namedtuple
- 【C】KoobooJson在asp.net core中的使用
- 看懂 ,学会 .NET 事件的正确姿势-简单版
- CentOS7配置samba共享文件系统
- Pessimistic and Optimistic locking
- 使用DEVC创建C语言工程
- Java 实现视频裁剪(附代码) | Java工具类
- 微软王码五笔86版 for winnt/2000/xp v7.3 免费
- 苹果台式机怎么设置我的电脑计算机,怎么让台式电脑用苹果手机的wifi上网
- PTA L1-049 天梯赛座位分配(20分)(python)
- 教你如何赚取你的第一桶金 - 2048(含源码)
- 计算机c盘空间满了应该怎么办,C盘空间越来越小怎么办?电脑C盘满了怎么办?...
- 郭天祥自学单片机的方法
- java计算机毕业设计中国民航酒店分销系统源码+系统+lw+数据库+调试运行
- css图片按键变手指,CSS-悬停button标签时如何使光标变为手形
- 海思Hi3516CV500/Hi3516DV300处理参数比较
- 计算机主机与外部交换的部件是,主机与外部设备的信息交换.PPT