如何寫(
1)創(chuàng)建表用戶(如何寫名字 varchar(
10)。
)engine=innodb;(
2) insert into user values('shenjian');
(
3) insert into user values('shenjian');提問,連續(xù)執(zhí)行上面的語句,執(zhí)行結(jié)果是:
A 建表語句(
1)報錯 B 插入語句(
2)報錯 C 插入語句(
3)報錯 D 均不報錯 實操如上,所以答案是【D 均不報錯】
InnoDB必須要有聚集索引,行記錄按照聚集索引物理上排序。
必須要有聚集索引,并不代表一定要有主鍵。
(
1)如果定義了主鍵,主鍵就是聚集索引;(
2)如果沒有定義主鍵,第一個非空(not null)且唯一(unique)列是聚集索引;
(
3)如果沒有符合條件的列,會自動創(chuàng)建一個隱藏的row-id作為聚集索引;畫外音:本例就屬于第三種情況。
(
1) create table user( id int,name varchar(
10),primary key(id)
)engine=innodb;(
2) insert into user(name) values('shenjian');
(
3) insert into user(name) values('shenjian');提問,連續(xù)執(zhí)行上面的語句,執(zhí)行結(jié)果是:
A 建表語句(
1)報錯 B 插入語句(
2)報錯 C 插入語句(
3)報錯 D 均不報錯 實操如上,所以答案是:【C 插入語句(
3)報錯】
建表語句可以不主動設(shè)置主鍵非空(上例中的id),InnoDB會自動添加非空(not null)且唯一(unique)的限制。
insert into user(name) values('shenjian');id默認(rèn)為0,第一次插入成功,第二次插入主鍵沖突。
畫外音:這一題很多人答錯。練習(xí)
三:建表時,可不可以選擇多個字段做主鍵?(
1) create table user(
id int not null,name varchar(
10) not null,primary key(id,name)
)engine=innodb;(
2) insert into user values(
1,'shenjian');
(
3) insert into user values(
1,'zhangsan');(
4) insert into user values(
2,'shenjian');
提問,連續(xù)執(zhí)行上面的語句,執(zhí)行結(jié)果是:A 建表語句(
1)報錯 B 插入語句(
2)報錯 C 插入語句(
3)報錯
D 插入語句(
3)報錯 E 均不報錯 實操如上,所以答案是:【E 均不報錯】 這就是所謂的聯(lián)合主鍵,不要求每個列唯
一,而要求聯(lián)合主鍵各個列的“組合唯一”。
畫外音:聯(lián)合索引,聯(lián)合主鍵,類似的。練習(xí)
四:可不可以主動插入自增主鍵?(
1) create table user(
id int auto_increment,name varchar(
10) not null,primary key(id)
)engine=innodb;(
2) insert into user(name) values('shenjian');
(
3) insert into user(id,name) values(
10,'shenjian');
(
4) insert into user(name) values('shenjian');畫外音:建表時,自增ID為主鍵,插入若干元素,有些包含自增ID,有些不包含。
提問,連續(xù)執(zhí)行上面的語句,執(zhí)行結(jié)果是:A 建表語句(
1)報錯 B 插入語句(
2)報錯 C 插入語句(
3)報錯
D 插入語句(
3)報錯 E 均不報錯 實操如上,所以答案是:【E 均不報錯】 自增ID經(jīng)常被用來作為主鍵,插入行記錄時,不指定值,InnoDB自動增加。
同時,也可以手動指定值:
(
1)手動指定的值與已有值重復(fù),則主鍵沖突;(
2)與已有值不沖突,則插入成功;(
3)未來不指定值插入,會從手動插入值往后繼續(xù)遞增;
如上例,手動插入10后,未來插入的行會從11開始,自增ID中間出現(xiàn)空洞。練習(xí)
五:建表時,可不可以使用聯(lián)合自增主鍵?
(
1) create table user( id int auto_increment,name varchar(
10) not null,
primary key(name,id) )engine=innodb;(
2) insert into user(name) values('shenjian');
(
3) insert into user(id,name) values(
10,'shenjian');
(
4) insert into user(name) values('shenjian');提問,連續(xù)執(zhí)行上面的語句,執(zhí)行結(jié)果是:
A 建表語句(
1)報錯 B 插入語句(
2)報錯 C 插入語句(
3)報錯 D 插入語句(
3)報錯 E 均不報錯
實操如上,所以答案是:【A 建表語句(
1)報錯】 這里不是指自增ID不能作為聯(lián)合主鍵,而是如果作為聯(lián)合主鍵,必須放在第一列。
primary key(name,id) 改為 primary key(id,name) 就可以執(zhí)行成功了。
畫外音:這一題很多人答錯??偨Y(jié)(
1)有主鍵,主鍵是聚集索引;(
2)沒有主鍵,首個非空唯一列是聚集索引;
(
3)沒有符合條件的列,row-id是聚集索引;主鍵和聚集索引不是一個東西,不要混淆。
三:InnoDB建表時,可不可以選擇多個字段做主鍵?
可以使用聯(lián)合主鍵,組合列唯一即可。
四:InnoDB插入時,可不可以主動插入自增主鍵?可以指定自增列的值,但可能導(dǎo)致空洞。
五:InnoDB建表時,可不可以使用聯(lián)合自增主鍵?可以,但自增ID必須在聯(lián)合主鍵的第一列。希望大家對主鍵有更系統(tǒng)性的認(rèn)識。