转mysql_「转」MySQL不为人知的主键与唯一索引约束
今天和大家简单聊聊MySQL的约束主键与唯一索引约束:
PRIMARY KEY and UNIQUE Index Constraints
文章不长,保证有收获。
触发约束检测的时机:
- insert
- update
当检测到违反约束时,不同存储引擎的处理动作是不一样的。
如果存储引擎支持事务,SQL会自动回滚。
例子:
create table t1 (
id int(10) primary key
)engine=innodb;
insert into t1 values(1);
insert into t1 values(1);
其中第二条insert会因为违反约束,而导致回滚。
通常可以使用:
show warnings;
来查看违反约束后的错误提示。
如果存储引擎不支持事务,SQL的执行会中断,此时可能会导致后续有符合条件的行不被操作,出现不符合预期的结果。
例子:
create table t2 (
id int(10) unique
)engine=MyISAM;
insert into t2 values(1);
insert into t2 values(5);
insert into t2 values(6);
insert into t2 values(10);
update t2 set id=id+1;
update执行后,猜猜会得到什么结果集?
猜想一:2, 6, 7, 11
猜想二:1, 5, 6, 10
.
.
.
都不对,正确答案是:2, 5, 6, 10
第一行id=1,加1后,没有违反unique约束,执行成功;
第二行id=5,加1后,由于id=6的记录存在,违反uinique约束,SQL终止,修改失败;
第三行id=6,第四行id=10便不再执行;
画外音:这太操蛋了,一个update语句,部分执行成功,部分执行失败。
为了避免这种情况出现,请使用InnoDB存储引擎,InnoDB在遇到违反约束时,会自动回滚update语句,一行都不会修改成功。
画外音:大家把存储引擎换成InnoDB,把上面的例子再跑一遍,印象更加深刻。
另外,对于insert的约束冲突,可以使用:
insert … on duplicate key
指出在违反主键或唯一索引约束时,需要进行的额外操作。
例子:
create table t3 (
id int(10) unique,
flag char(10) default 'true'
)engine=MyISAM;
insert into t3(id) values(1);
insert into t3(id) values(5);
insert into t3(id) values(6);
insert into t3(id) values(10);
insert into t3(id) values(10) on duplicate key update flag='false';
insert执行后,猜猜会发生什么?
插入id=10的记录,会违反unique约束,此时执行update flag=’false’,于是有一行记录被update了。
这相当于执行:
update t3 set flag='false' where id=10;
仔细看,insert的结果返回,提示:
Query OK, 2 rows affected
有意思么?
画外音:本文所有实验,基于MySQL5.6。
总结,对于主键与唯一索引约束:
- 执行insert和update时,会触发约束检查
- InnoDB违反约束时,会回滚对应SQL
- MyISAM违反约束时,会中断对应的SQL,可能造成不符合预期的结果集
- 可以使用 insert … on duplicate key 来指定触发约束时的动作
- 通常使用 show warnings; 来查看与调试违反约束的ERROR
互联网大数据量高并发量业务,为了大家的身心健康,请使用InnoDB。
-------------------------------------------------------------------
转自微信公众号 架构师之路
转mysql_「转」MySQL不为人知的主键与唯一索引约束相关推荐
- mysql中主键、普通索引、唯一索引和全文索引
SQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录 ...
- mysql主键和唯一索引_mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
- mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
- mysql主键和唯一索引_主键和唯一索引的有什么区别
主键和唯一索引的区别 -- 区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值 ...
- 索引,主键,唯一索引,联合索引的区别
https://blog.csdn.net/qq_33275924/article/details/80220797 https://www.cnblogs.com/ymj0906/p/4240856 ...
- 索引,主键,唯一索引,联合索引 的区别
简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响 索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用 ...
- 主键和唯一索引区别?
一.唯一索引: 一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率: 二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了:如 ...
- 主键和唯一索引的区别
原文地址:http://blog.csdn.net/baoqiangwang/article/details/4832814 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 区别 1. 主 ...
- 关系型数据库中联合主键和唯一索引的应用
一.前言 在项目开发中往往会遇到两个实体对象之间存在多对多关系的情况,此时我们会维护两个实体对象表,一个关系表,用来存放两者之间的关系.比较典型的案例是学生表.课程表.学生课程关系表.在这种关系表中, ...
- oracle中主键和唯一索引的区别说明
上周六去参加上海Oracle WDP俱乐部沙龙的一次交流,其中提到了关于"Oracle中主键和唯一索引的区别",基本上大家都可以说上几个,在网上也可以找到,但是总感觉不太全,根据自 ...
最新文章
- java kafka 分区_Kafka 主题和分区
- labview如何进行串口通讯(转)
- React事件系统研究总结
- 使用final修饰局部变量???
- mysqldump使用详解
- v-for key的作用
- ActiveMQ 无法启动 提示端口被占用 解决方案
- 浙江大学在Github开源了计算机课程,看完在家上个 985
- visio添加连接点
- 81章 老子1章到_三曜道长解读道德经: 信言不美 第81章
- 苹果服务器 显示器,苹果M1芯片的Mac可以外接什么显示器 显示器最高支持多少分辨率...
- 数据仓库建设---数据建模
- 2019届华为秋招面试
- 【安全】Web指纹识别
- uni-app 汉字转拼音 搜索和按首字母排序页面
- 三级无刷交流发电机matlab模型,三级无刷交流发电机调压系统的建模及其仿真分析...
- php小偷替换代码,收藏的一个php小偷的核心程序
- 免费在线恋爱纪念日、结婚纪念日计算器
- Java基础案例3-1:基于控制台的购书系统
- 高博第9讲project opencv viz模块