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;
MySQL不为人知的主键与唯一索引约束

文章插图
 
 
来查看违反约束后的错误提示 。
 
如果存储引擎不支持事务 , 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便不再执行;


    推荐阅读