設定自增主鍵 主鍵,聚集索引,不是乙個東西

2021-10-14 19:13:04 字數 4449 閱讀 1219

練習一:建表時,可不可以不宣告主鍵?

(1) create table user(

name varchar(10)

)engine=innodb;

(2) insert into user values('shenjian');

(3) insert into user values('shenjian');

畫外音:建表時,不宣告主鍵,插入兩個相同的元素。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 均不報錯

實操如上,所以答案是【d 均不報錯】

innodb必須要有聚集索引,行記錄按照聚集索引物理上排序。必須要有聚集索引,並不代表一定要有主鍵。

(1)如果定義了主鍵,主鍵就是聚集索引;

(2)如果沒有定義主鍵,第乙個非空(not null)且唯一(unique)列是聚集索引;

(3)如果沒有符合條件的列,會自動建立乙個隱藏的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');

畫外音:建表時,不宣告非空,插入兩個相同的元素。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 均不報錯

實操如上,所以答案是:【c 插入語句(3)報錯】

建表語句可以不主動設定主鍵非空(上例中的id),innodb會自動新增非空(not null)且唯一(unique)的限制。

使用show create table檢視,會發現主鍵列要求非空,且預設值是0,因此:

insert into user(name) values('shenjian');

id預設為0,第一次插入成功,第二次插入主鍵衝突。

畫外音:這一題很多人答錯。

練習三:建表時,可不可以選擇多個字段做主鍵?

(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');

畫外音:建表時,宣告聯合主鍵(a,b),插入若干元素,有些a重複,有些b重複。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 插入語句(3)報錯

e 均不報錯

實操如上,所以答案是:【e 均不報錯】

這就是所謂的聯合主鍵,不要求每個列唯一,而要求聯合主鍵各個列的「組合唯一」。

畫外音:聯合索引,聯合主鍵,類似的。

練習四:可不可以主動插入自增主鍵?

(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,有些不包含。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 插入語句(3)報錯

e 均不報錯

實操如上,所以答案是:【e 均不報錯】

自增id經常被用來作為主鍵,插入行記錄時,不指定值,innodb自動增加。同時,也可以手動指定值:

(1)手動指定的值與已有值重複,則主鍵衝突;

(2)與已有值不衝突,則插入成功;

(3)未來不指定值插入,會從手動插入值往後繼續遞增;

如上例,手動插入10後,未來插入的行會從11開始,自增id中間出現空洞。

練習五:建表時,可不可以使用聯合自增主鍵?

(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');

畫外音:建表時,宣告聯合主鍵(a,b),並且有乙個是自增id,插入若干元素,包含自增id,有些不包含。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 插入語句(3)報錯

e 均不報錯

實操如上,所以答案是:【a 建表語句(1)報錯】

這裡不是指自增id不能作為聯合主鍵,而是如果作為聯合主鍵,必須放在第一列。

改為primary key(id, name)

就可以執行成功了。

畫外音:這一題很多人答錯。

總結

一:innodb建表時,可不可以不宣告主鍵?

可以不宣告主鍵,但必須要有聚集索引:

(1)有主鍵,主鍵是聚集索引;

(2)沒有主鍵,首個非空唯一列是聚集索引;

(3)沒有符合條件的列,row-id是聚集索引;

主鍵和聚集索引不是乙個東西,不要混淆。

二:innodb建表時,可不可以不宣告主鍵非空?

可以不宣告主鍵非空,會自動加上非空限制。

三:innodb建表時,可不可以選擇多個字段做主鍵?

可以使用聯合主鍵,組合列唯一即可。

四:innodb插入時,可不可以主動插入自增主鍵?

可以指定自增列的值,但可能導致空洞。

五:innodb建表時,可不可以使用聯合自增主鍵?

可以,但自增id必須在聯合主鍵的第一列。

希望大家對主鍵有更系統性的認識。

MySQL設定主鍵自增和非主鍵自增

mysql 每張表只能有1個自動增長字段,這個自動增長字段即可作為主鍵,也可以用作非主鍵使用,但是請注意將自動增長字段當做非主鍵使用時必須必須為其新增唯一索引,否則系統將會報錯。例如 將自動增長字段設定為主鍵 create table t1 id int auto increment primary...

設定Oracle主鍵自增

oracle沒有設定主鍵auto increment的功能,需要自己編寫序列和觸發器實現主鍵自動遞增。示例 建立表menu create table menu menuid number 10 not null primary key,name varchar2 40 not null,id par...

oracle設定主鍵自增

oracle中沒有自增字段,可通過序列 觸發器間接實現,cmd中sqlplus登入,直接執行即可。一般要經過一下幾步 1建立資料表 code create table test increase userid number 10 primary key,主鍵,自動增加 username varcha...