自增主键,很多人以为自己懂了,然而...

InnoDB下,自增键的机制,真的搞透彻了吗?可以尝试回答一下以下四个问题。

 

实验一、自增键初始值测验

drop table t1;
create table t1(
    id in
t not null auto_increment,
    name varchar(10) unique,
    count int default 0,
    primary key(id),
    index(name)
)engine=innodb;

insert into t1(name) values("zhangsan"),("lisi"),("wangwu");
select * from t1;

 

请问,被插入的三条记录,id分别为:

A 0,1,2

B 1,2,3

C 以上都不对
画外音:初始值,是0还是1?

 

实验二、批量插入测验

drop table t1,t2;
create table t1(
    id int not null
auto_increment,
    name varchar(10) unique,
    count int default 0,
    primary key(id),
    index(name)
)engine=innodb;

create table t2(
    name varchar(10) unique
)engine=innodb;

insert into t2(name) values("x"),("y"),("z");

insert into t1(name) select name from t2;
select * from t1;

 

请问,上述insert...select...的执行结果是:

A 插入成功

B 插入失败,自增键报错

C 以上都不对

画外音:insert ... select ...这种批量插入,对于自增键是否有影响呢?

 

实验三、混合插入测验

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");
select * from t1;

 

请问,最后一个insert语句,执行结束后id分别是:

A 1,2,3,111,222

B 1,111,112,222,223

C 插入失败,自增键报错

D 以上都不对

 

实验四、insert ... on duplicate key测验

接着实验三,继续执行以下语句:

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

on duplicate key update count=100;

select * from t1;

 

请问,最后一个insert语句,执行结束后id分别是:

A 1,2,3,111,222,223,224,225

B 1,111,112,222,223,224,225,226

C 1,111,112,222,223,224,225

D 1,111,112,222,223,225,226

E 以上都不对

 

很多时候,我们只是以为自己懂了。

画外音:做实验之前,版本先拉平到MySQL5.6。

 

更复杂的问题是:InnoDB在并发插入情况下,自增键的锁机制是怎样的?

画外音:
(1)行锁还是表锁?
(2)事务范围加锁还是SQl语句范围加锁?

架构师之路-分享技术思路

相关文章

改了配置,不想重启,怎么整?

故障转移,服务发现,负载均衡,居然都和它有关!

四个测验,你的答案是什么?

发布了671 篇原创文章 · 获赞 630 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/shenjian58/article/details/103379800