mysql的外來鍵foreign key作用

2021-10-20 07:34:11 字數 4393 閱讀 8382

目錄

什麼是外來鍵

建立外來鍵約束

create table 操作外來鍵示例

alter table 操作外來鍵示例

外來鍵約束的作用

使用外來鍵的優缺點

使用外檢約束條件

測試下外來鍵的作用

未指定事件觸發限制預設為restrict時

觸發限制預設為cascade時

乙個表中的 foreign key 指向另乙個表中的 unique key(唯一約束的鍵)。

建立外來鍵可以在建表時直接新增,也可以在已有表中給字段新增外來鍵,完整寫法如下:

[constraint symbol] foreign key[id] (index_col_name, …)

references tbl_name (index_col_name, …)

[on delete ]

[on update ]

對上面語法做下說明:

[constraint symbol]:指定外鍵名,如果不指定constraint symbol,mysql會自動生成乙個名字。

foreign key (index_col_name, …):指定作為外來鍵的字段。

references tbl_name (index_col_name, …): 外來鍵依賴的表及字段。

on delete、on update:表示事件觸發限制。

on delete、on update可選引數如下:

create table t_test_1(

id int primary key auto_increment,

test_id int not null,

constraint test_foreign_name foreign key(test_id) references t_test(id) on delete cascade on update cascade

);

alter table t_test_1 drop foreign key test_foreign_name; -- 刪除外來鍵

alter table t_test_1 add foreign key(test_id)  references t_test(id) on update cascade on delete restrict; -- 新增外來鍵

對子表:子表進行寫操作時,如果外來鍵在父表中沒有匹配的記錄,操作會失敗。

對父表:對父表中依賴字段(子表作為外來鍵的字段)進行刪除和修改時,操作會失敗。

優點:可以使兩表關聯,保證資料的一致性和實現一些級聯操作。

缺點:資料庫的外來鍵約束,會有一定的效能損耗,其實網際網路企業中不建議使用,通常級聯更新和刪除都是由應用層邏輯進行邏輯判斷並實現。

兩個表必須是innodb表。

外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯示建立。

外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以。

刪除主表時,需要先刪除子表對應的資料。

刪除子表可以隨意刪除。

插入主表可以隨便插入。

插入子表依賴於主表的資料必須有。

更新主表會違反約束(如果更新的主表字段為子表外來鍵且子表有相應資料會違反約束)。

更新子表隨意。

測試過程如下:

建dage和小弟兩個表,如下:

create table dage(

id int(11) not null auto_increment,

name varchar(32) default '',

primary key(id)

);create table xiaodi(

id int(11) not null auto_increment,

dage_id int(11) ,

name varchar(32) default '',

primary key(id),

constraint xiaodi_ibfk_1 foreign key(dage_id) references dage(id) 

);

兩張表分別插入一條資料:

把大哥刪除:

如上,小弟們不樂意了,大哥你不能走啊,你可不能不管我們呢!

作為銅鑼灣扛把子怎麼只有乙個小弟呢,再來乙個新的小弟:

衝陳浩南威名慕名而來投靠的小弟也想人陳浩南當大哥,並且還不知道他來自哪,是誰的小弟(主表沒有id為2的資料),插入乙個小弟

大哥發話了,雖然我威名遠揚,你也不能背叛師傅投靠我門下啊,先回去吧,不收不收。

有一天,乙個小弟說,什麼小弟a,小弟b的,不好聽,我想換個好聽的名字,陳浩南說:當然是可以的,不只換個名字可以,不做我小弟也是可以的

又有一天,陳浩南對山雞說,以後別叫我陳浩南了,不能知乎姓名,以後你叫我南哥吧

逐漸壯大的烏鴉來搶地盤了,非讓南哥的小弟山雞叫他大哥,山雞怎麼會願意呢,

刪除主表時,子表級聯刪除。

刪除子表可以隨意刪除。

插入主表可以隨便插入。

插入子表依賴於主表的資料必須有。

更新主表時,子表級聯更新。

更新子表隨意。

測試過程如下:

刪除原有外來鍵,再新增外來鍵並設定觸發限制為cascade:

-- 刪除原有外來鍵

alter table xiaodi drop foreign key xiaodi_ibfk_1;

-- 新增外來鍵

alter table xiaodi add foreign key(dage_id) references dage(id) on update cascade on delete cascade;

測試下新增:

insert into dage(name)values('烏鴉');

insert into xiaodi(dage_id, name) values (1,'大頭');

insert into xiaodi(dage_id, name) values (5,'焦皮');-- 不行

測試下修改:

先看下現在的資料

-- 小弟認個別的大哥是可以的

update xiaodi set dage_id = 1 where id = 2;

-- 大哥將手下小弟都託付給別的人也可以

update dage set id = 3 where id = 2;

此時小弟表的dage欄位也都改了

測試下刪除:

-- 以下都是可以的,換句話說小弟可以隨意脫離,大哥想隱退的時候忠實的小弟也會選擇一起隱退 

delete from xiaodi where id = 2;

delete from dage where id = 1;

另外,乙個表的鍵不能作為多個表的外來鍵,建立表直接報錯,如下: 

create table t_test_2(

id int primary key auto_increment,

test_id int not null,

constraint test_foreign_name foreign key(test_id) references t_test(id) on delete cascade on update cascade

);

mysql外來鍵的應用 MySQL外來鍵應用

mysql外來鍵應用,所有tables必須是innodb型,它們不能是臨時表.因為在mysql中只有innodb型別的表才支援外來鍵.mysql版本 5.5.28 系統平台 rhel 5.8 32位 1 外來鍵的使用 外來鍵的作用,主要有兩個 乙個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性 ...

mysql 所有外來鍵 mysql中的外來鍵

mysql中的外來鍵 1.預設的外來鍵存在之後,會對資料進行約束。1 約束1 如果子表中新增的資料,外來鍵字段對應的資料如果在父表中不存在,那麼新增失敗。有資料之後 2 約束2 父表不能刪除 或者修改 乙個被子表引用的資料記錄 3.外來鍵約束 預設的使用者所能看到的約束都是外來鍵的一種約束 嚴格模式...

mysql 外來鍵 del 記錄 MySQL 外來鍵

在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...