數據庫——(9)外鍵

外鍵:foreign key,外面的鍵(鍵不在自己表中):如果A表中有一個字段(非主鍵)指向B表中的主鍵,那麼稱該字段爲外鍵。
外鍵作用:默認作用有兩點:一個對父表,一個對子表(外鍵字段所在的表)。

對字表約束:字表數據進行寫操作(增和改)的時候,如果對應的外鍵字段在父表找不到對應的匹配,那麼操作會失敗。(約束字表數據操作)。
對父表約束:父表數據進行寫操作(刪和改:都必須涉及到主鍵本身),如果對應的主鍵在字表中已經被數據所引用,那麼就不允許操作。

外鍵條件:

1.外鍵要存在首先必須保證表的存儲引擎是innodb,如果不是innodb存儲引擎,那麼即使外鍵可以創建成功也沒有約束效果。
2.外鍵字段的字段類型(列類型)必須與父表的主鍵類型完全一致。
3.一張表中外鍵名字不能重複
4.增加外鍵的字段(如果數據已經存在),必須保證數據與父表主鍵對應。  

增加外鍵
外鍵可以在創建表的時候或者創建表之後增加(但是要考慮數據的問題)。
1.創建表的時候增加外鍵:在所有的表字段之後,使用foreign key(外鍵字段)references 外部表(主鍵字段)。

create table my_foreign1(
id int primary key auto_increment,
name varchar(20) not null comment '學生姓名',
c_id int comment '班級id',
foreign key(c_id) references my_class(id)
)charset utf8;

2.新增表之後增加外鍵:修改表結構。
Alter table 表名 add[constraint 外鍵名字] foreign key(外鍵字段)references 父表(主鍵字段);

create table my_foreign2(
id int primary key auto_increment,
name varchar(20) not null comment '學生姓名',
c_id int comment '班級id'
)charset utf8;

alter table my_foreign2 add 
constraint stu_class_1
foreign key(c_id) references my_class(id);

修改外鍵&刪除外鍵
外鍵不可修改:只能先刪除後新增。
刪除外鍵:alter table 表名 drop foreign key 外鍵名;

alter table my_foreign2 drop foreign key stu_class_1;

注意:外鍵刪除的結果不會在表結構中體現出來,可以通過表創建語句來查看是否刪除。

外鍵約束
外鍵約束就是指外鍵的作用,這裏不是默認的作用
外鍵約束有三種模式:都是針對父表的約束。

1.district:嚴格模式(默認的),父表不能刪除或更新一個已經被子表數據引用的紀錄。
2.cascade:級聯模式,父表的操作,對應子表關聯的數據也跟着操作。
3.set null:置空模式,父表的操作之後,子表對應的數據(外鍵字段)被置空。

通常的操作(約束模式):刪除的時候子表置空,更新的時候子表級聯操作。
指定模式的語法:
foreign key(外鍵字段) references 父表(主鍵字段) on delete set null on update cascade;

create table my_foreign3(
id int primary key auto_increment,
name varchar(20) not null comment '學生姓名',
c_id int comment '班級id',
foreign key(c_id) references my_class(id) 
on delete set null on update cascade
)charset utf8;

刪除置空的前提條件:外鍵字段允許爲空(如果不滿足條件,外鍵無法創建)。

發佈了38 篇原創文章 · 獲贊 2 · 訪問量 9702
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章