mysql中外鍵的作用和舉例

2021-06-22 14:38:01 字數 2508 閱讀 9271

(1)基本介紹

外來鍵作用: 使兩張表形成關聯,外來鍵只能引用外表中的指定列的值!

建立外來鍵的前提: 本表的列必須與外來鍵型別相同(外來鍵必須是外表的主鍵)。

指定外來鍵關鍵字: foreign key(列名)

引用外來鍵關鍵字: references 《外來鍵表名》(外來鍵列名)

事件觸發限制: on delete和on update , 可設引數cascade(跟隨外來鍵改動), restrict(限制外表中的外來鍵改動),set null(設空值),set default(設預設值),[預設]no action

例如:outtable表 主鍵 id 型別 int

建立含有外來鍵的表:

create table temp(

id int,

name char(20),

foreign key(id) references outtable(id) on delete cascade on update cascade);

說明:把id列 設為外來鍵 參照外表outtable的id列 當外來鍵的值刪除 本表中對應的列篩除 當外來鍵的值改變本表中對應的列值改變。

(2)定義資料表

假如某個電腦生產商,它的資料庫中儲存著整機和配件的產品資訊。用來儲存整機產品資訊的表叫做 pc;用來儲存配件供貨資訊的表叫做 parts。

在 pc 表中有乙個字段,用來描述這款電腦所使用的cpu型號;

在 parts 表中相應有乙個字段,描述的正是cpu的型號,我們可以把它想成是全部cpu的型號列表。

很顯然,這個廠家生產的電腦,其使用的 cpu 一定是供貨資訊表(parts)中存在的型號。這時,兩個表中就存在一種約束關係(constraint)—— pc 表中的 cpu 型號受到 parts 表中型號的約束。

首先我們來建立 parts 表:

create table parts (

... 字段定義 ...,

model varchar(20) not null,

... 字段定義 ...

);接下來是 pc 表:

create table pc (

... 字段定義 ...,

cpumodel varchar(20) not null,

... 字段定義 ...

};(3)設定索引

若要設定外來鍵,在參照表 (referencing table,即pc表) 和被參照表 (referenced table,即parts表) 中,相對應的兩個字段必須都設定索引 (index),也可以設定為候選鍵(key),因為在很多情況下索引(index)和候選鍵(key)的功能等同。

對parts表:

alter table parts add index idx_model (model);

這句話的意思是,為 parts 表增加乙個索引,索引建立在 model 欄位上,給這個索引起個名字叫idx_model。

對pc表也類似:

alter table pc add index idx_cpumodel (cpumodel);

事實上這兩個索引可以在建立表的時候就設定。這裡只是為了突出其必要性。

(4)定義外來鍵

下面為兩張表之間建立前面所述的那種「約束」。因為pc的cpu型號必須參照parts表中的相應型號,所以我們將pc表的cpumodel欄位設定為「外來鍵」(foreign key),即這個鍵的參照值來自於其他表。

alter table pc add constraint fk_cpu_model

foreign key (cpumodel)

references parts(model);

第一行是說要為pc表設定外來鍵,給這個外來鍵起乙個名字叫做fk_cpu_model;第二行是說將本表的cpumodel欄位設定為外來鍵;第三行是說這個外來鍵受到的約束來自於parts表的model欄位。

這樣,我們的外來鍵就搞好了!如果我們試著create一台pc,它所使用的 cpu 的型號是 parts 表中不存在的,那麼 mysql 會禁止這台 pc 被 create 出來。

(5)級聯操作

一切看起來都挺好的,不是嗎?

考慮以下這種情況:

技術人員發現,乙個月之前輸入到 parts 表中的某個系列的 cpu (可能有很多款)的型號全都輸錯了乙個字母,現在需要改正。我們希望的是,當 parts 表中那些 referenced column 有所變化時,相應表中的 referencing column 也能自動更正。

可以在定義外來鍵的時候,在最後加入這樣的關鍵字:

on update cascade; 即在主表更新時,子表(們)產生連鎖更新動作,似乎有些人喜歡把這個叫「級聯」操作。:)

如果把這語句完整的寫出來,就是:

alter table pc add constraint fk_cpu_model

foreign key (cpumodel)

references parts(model)

on update cascade;

除了 cascade 外,還有 restrict(禁止主表變更)、set null(子表相應字段設定為空)等操作

MySQL中 外來鍵約束

alter table yourtablename add constraint 外鍵名 foreign key id index col name,references tbl name index col name,on delete on update 說明 on delete on upda...

Mysql中外鍵詳解

1.定義外來鍵的操作 2.這個外來鍵的名字該如何定義?3.乙個表的外來鍵必是另乙個表的主鍵 比如,如果不定義student中sno為主鍵,那麼score的sno為外來鍵就無法定義 create table student sno varchar 20 not null primary key,cno...

MySQL中外鍵約束

外來鍵的好處 可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作 如果在父表中找不到候選鍵,則不允許在子表上進行insert update 外來鍵定義服從下列情況 所有tables必須是innodb型,它們不能是臨時表。在引用表中,必須有乙個索引,外來鍵列以同樣的順序被列在其中作為第一列。這樣乙...