自增ID插入时,究竟发生了什么?

自增ID插入时,究竟发生了什么?插图亿华云

《​​MySQL自增ID,居然大部分人都搞错了​​?​》中的作业题,有少量答对的人,但原理讲得不透,今天简单说下作业题中的答案,以及相关知识点。

作业题是这样的:

drop table t1;

create table t1(

id int not null auto_increment,

name varchar(10) unique,

count int default 0,

primary key(id),

index(name)

)engine=innodb;

insert into t1(id, name) values(1, "shenjian");

insert into t1(id, name) values

(111, "111"),(NULL, "abc"),(222, "222"),(NULL,"xyz");

执行结束后id分别是:

(1, shenjian)

(111, 111) // 允许指定值

(112, abc) // 忽略NULL,从最大值开始增

(222, 222) // 允许指定值

(223, xyz) // 忽略NULL,从最大值开始增

如果继续执行以下语句:

insert into t1(name)values("shenjian"),("aaa"),("bbb")

on duplicate key update count=100;

请问:

会不会执行报错?如果报错,为什么呢?如果不报错,得到的数据是什么呢?

知其然,知其所以然。先系统性讲讲相关知识点,InnoDB自增键,插入,如何插入,以及插入之后发生了什么?

画外音:本文均以MySQL5.6,InnoDB引擎为例。

​什么是插入?

MySQL有一系列的语句,可以往数据库新增数据,称作泛插入语句(insert-like statement)。不同的插入方式,对自增键的影响是不一样的。

画外音:自增键,是指auto_increment,大家应该都用得很多。

有几种插入方式?​

更为细化后,总的来说,插入方式分为三类:

简单插入(simple insert)批量插入(bulk insert)混合插入(mixed-mode insert)什么是简单插入(simple insert)?

​普通的insert/replace语句,不管是单条插入还是多条插入,都是简单插入。

画外音:

不包含递归的子查询;不包含insert … on duplicate key update…

THE END
Copyright © 2024 亿华云