InnoDB下,自增鍵的機制,真的搞透徹了嗎?可以嘗試回答一下以下四個問題。 實驗一、自增鍵初始值測驗
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(name) values("zhangsan"),("lisi"),("wangwu");
select from t1;
請問,被插入的三條記錄,id分别為:A 0,1,2B 1,2,3C 以上都不對
畫外音:初始值,是0還是1? 實驗二、批量插入測驗
drop table t1,t2;
create table t2(
name varchar(10) unique
insert into t2(name) values("x"),("y"),("z");
insert into t1(name) select name from t2;
請問,上述insert...select...的執行結果是:A 插入成功B 插入失敗,自增鍵報錯C 以上都不對畫外音:insert ... select ...這種批量插入,對于自增鍵是否有影響呢? 實驗三、混合插入測驗drop table t1;
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,222B 1,111,112,222,223C 插入失敗,自增鍵報錯D 以上都不對 實驗四、insert ... on duplicate key測驗接着實驗三,繼續執行以下語句:
insert into t1(name)values("shenjian"),("aaa"),("bbb")
on duplicate key update count=100;
請問,最後一個insert語句,執行結束後id分别是:A 1,2,3,111,222,223,224,225B 1,111,112,222,223,224,225,226C 1,111,112,222,223,224,225D 1,111,112,222,223,225,226E 以上都不對 很多時候,我們隻是以為自己懂了。畫外音:做實驗之前,版本先拉平到MySQL5.6。 更複雜的問題是:InnoDB在并發插入情況下,自增鍵的鎖機制是怎樣的?畫外音:
(1)行鎖還是表鎖?
(2)事務範圍加鎖還是SQl語句範圍加鎖?
本文轉自“架構師之路”公衆号,58沈劍提供。