如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。由此可見,外來鍵表示了兩個關係之間的相關聯絡。以另乙個關係的外來鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外來鍵又稱作外關鍵字。
中文名外來鍵
外文名foreign key別 名
外碼、外關鍵字
應用學科
資料庫作 用
外來鍵定義
編輯外來鍵定義設f是基本關係r的乙個或一組屬性,但不是關係的鍵,ks是基本關係s的主鍵。如果f與ks相對應,則稱f是r的外來鍵,並稱基本關係r為參照關係,基本關係s為被參照關係或目標關係。
換而言之,如果關係模式r中的某屬性集不是r的主鍵,而是另乙個關係r1的主鍵則該屬性集是關係模式r的外來鍵,通常在資料庫設計中縮寫為fk。
在實際操作中,將乙個表的值放入第二個表來表示關聯,所使用的值是第乙個表的主鍵值(在必要時可包括復合主鍵值)。此時,第二個表中儲存這些值的屬性稱為外來鍵(foreign key)。[1]
顯然目標關係的主碼和參照關係的外碼必須定義在乙個或同一組的域上。關係r和s不一定是不同的關係,即外來鍵不一定要與相應的主鍵同名。如在學生(學號,姓名,性別,專業號,年齡,班長)關係中,「學號」是主鍵,「班長」屬性表示該學生所在班級的班長的學號,它引用了本關係中「學號」屬性,因此「班長」是外來鍵,這裡學生關係既是參照關係也是被參照關係。不過在實際應用中為了便於識別,當主鍵與相應的外來鍵屬於不同關係時,往往取相同的名字。[2]
外來鍵作用
編輯保持資料一致性,完整性,主要目的是控制儲存在外鍵表中的資料。 使兩張表形成關聯,外來鍵只能引用外表中的列的值或使用空值。[3]
圖1 控制儲存在外鍵表中的資料學號在成績表(表2)中是主鍵,在學生表(表1)中是外來鍵。如果不使用外來鍵,表1的學號字段插了乙個值(比如20140999999),但是這個值在表2中並沒有,這個時候,資料庫允許插入,並不會對插入的資料做關係檢查。然而在設定外來鍵的情況下,插入表1學號字段的值必須要求在表1的學號字段能找到。 同時,如果要刪除表2的某個學號字段,必須保證表2中沒有引用該字段值的列,否則就沒法刪除。這就是所謂的保持資料的一致性和完整性。如圖1,如果表1還引用表2的某個學號,卻把表1中的這個學號刪了,表2就不知道這個學號對應的學生是哪個學生。
資料庫中的表必須符合規範,才能杜絕資料冗餘、插入異常、刪除異常等現象。規範的過程是分解表的過程。經過分解,同一事物的代表屬性出現在不同的表中。顯然,它們應該保持一致。外來鍵的值或者是另外乙個表的主鍵值或者為空值。學號在學生表裡是主鍵,在成績表裡是外來鍵。成績表裡的學號一定要是學生表裡的學號。於是,學生表裡的學號和成績表裡的學號就一致了。可以直觀地理解,外來鍵的功能是實現同一事物在不同表中的標誌一致性。功能的實現由外來鍵聯絡的兩個表,在單獨操作時,外來鍵功能由兩種方法實現[4]
阻止執行從表插入新行,其外鍵值不是主表的主鍵值便阻止插入;
從表修改外鍵值,新值不是主表的主鍵值便阻止修改;
主表刪除行,其主鍵值在從表裡存在便阻止刪除(要想刪除,必須先刪除從表的相關行);
主表修改主鍵值,舊值在從表裡存在便阻止修改(要想修改,必須先刪除從表的相關行)。
級聯執行主表刪除行,連帶從表的相關行一起刪除;
主表修改主鍵值,連帶從表相關行的外鍵值一起修改。兩種方法提供給使用者選擇。無論選取哪種方法,從表裡都不會有多餘行。從另乙個角度理解,用拒絕同一事物在從表中的標誌與主表不一致來實現與主表中的標誌一致。
兩種實現方法,通過下面方式選擇:介面:設級聯更新、級聯刪除兩個選擇方框,選取則級聯執行、不選取則阻止執行;
命令:設e)kscm)e、restrict兩個可選項,cascade為級聯執行、restrict為阻止執行。
外來鍵應用
編輯外來鍵示例
student(s#,sname,d#),即學生這個關係有三個屬性:學號,姓名,所在系別。
dep(d#,dname),即院系有兩個屬性:系號、系名。
則s#、d#是主鍵,也是各自所在關係的唯一候選鍵,d#是student的外來鍵。
建立外來鍵的前提: 本表的列必須與外來鍵型別相同(外來鍵必須是外表主鍵)。
指定外來鍵關鍵字: 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列 當外來鍵的值刪除 本表中對應的列刪除 當外來鍵的值改變 本表中對應的列值改變。
注:在建立表中增加外來鍵的觸發事件是不行的,
create table temp(
id int,
name char(20),
foreign key(id) references outtable(id));
外來鍵使用原則
使用原則1、 為關聯字段建立外來鍵。
2、 所有的鍵都必須唯一。
3、避免使用復合鍵。
4、外來鍵總是關聯唯一的鍵字段。
外來鍵使用方法
主鍵表和外建表:
使用設計介面建立外來鍵時,出現主鍵表和外建表問題,上述使個人理解有誤:
create table table1
[id] int identity(1,1) primary key
gocreate table table2
[id] int not null,
foreign key ([id]) references [table1]([id])
gotable2 中引用了table1,在此table1為主鍵表,而table2 為外來鍵表。
總結:主鍵表是被引用的表,外來鍵表是引用其他表的表。
外來鍵有效性
有很多時候,程式設計師會發現字段缺少、多餘問題或者是建立外來鍵以後就不能新增沒有受約束的行[特殊情況下是有必要的],這個時候不想對錶結構進行操作,就可以使用約束失效。
以 northwind 為例:想給產品表【products表】新增一條不受種類表【categories表】限制的資料。可以使產品表中的 categories 約束失效。
寫法:alter table dbo.products nocheckconstraint fk_products_categories
新增完成後再使其有效:
alter table dbo.products check constraint fk_products_categories
這樣就完成不受某錶約束的資料新增了。
還有乙個好處是:如上述例子。修改 categories 表時 新增欄位時 要把所有引用 categories 表的外來鍵給失效。等給 categories 表新增字段完成後再使所有應用 categories 表的外來鍵恢復有效性即可。
詞條圖冊
更多圖冊
參考資料
1.外來鍵與參照完整性
.讀書頻道[引用日期2016-10-01]
2.王珊 薩師煊.資料庫系統概率(第5版):高等教育出版社,2014:46
3.mysql中的外來鍵是什麼、有什麼作用
.紅黑聯盟[引用日期2016-10-01]
4.外來鍵雜議一二
.維普[引用日期2017-03-16]
mysql外來鍵和外來鍵約束
1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...
mysql 外來鍵和外來鍵約束
1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...
mysql 外來鍵 del 記錄 MySQL 外來鍵
在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...