如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見,外鍵表示了兩個關系之間的相關聯系。以另一個關系的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外鍵又稱作外關鍵字。
使用實例
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,
人名 char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
說明:把id列 設為外鍵 參照外表outTable的id列 當外鍵的值刪除 本表中對應的列刪除 當外鍵的值改變 本表中對應的列值改變。
注:在創建表中增加外鍵的觸發事件是不行的,
create table temp(
id int,
人名 char(20),
foreign key(id) references outTable(id));
原則
1、為關聯字段創建外鍵。
2、所有的鍵都必須唯一。
3、避免使用復合鍵。
4、外鍵總是關聯唯一的鍵字段。
使用方法
主鍵表和外建表:
使用設計界面創建外鍵時,出現 主鍵表和外建表問題,上述使個人理解有誤:
CREATE TABLE TABLE1
(
[ID] INT IDENTITY(1,1) PRIMARY KEY
)
GO
CREATE TABLE TABLE2
(
[ID] INT NOT NULL,
FOREIGN KEY ([ID]) REFERENCES [TABLE1]([ID])
)
GO
TABLE2 中引用了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 表的外鍵恢復有效性即可。
定義
設F是基本關系R的一個或一組屬性,但不是關系的鍵,Ks是基本關系S的主鍵。如果F與Ks相對應,則稱F是R的外鍵,并稱基本關系R為參照關系,基本關系S為被參照關系或目標關系。
換而言之,如果關系模式R中的某屬性集不是R的主鍵,而是另一個關系R1的主鍵則該屬性集是關系模式R的外鍵,通常在數據庫設計中縮寫為FK。
在實際操作中,將一個表的值放入第二個表來表示關聯,所使用的值是第一個表的主鍵值(在必要時可包括復合主鍵值)。此時,第二個表中保存這些值的屬性稱為外鍵(foreign key)。
顯然目標關系的主碼和參照關系的外碼必須定義在一個或同一組的域上。關系R和S不一定是不同的關系,即外鍵不一定要與相應的主鍵同名。如在學生(學號,姓名,性別,專業號,年齡,班長)關系中,“學號”是主鍵,“班長”屬性表示該學生所在班級的班長的學號,它引用了本關系中“學號”屬性,因此“班長”是外鍵,這里學生關系既是參照關系也是被參照關系。不過在實際應用中為了便于識別,當主鍵與相應的外鍵屬于不同關系時,往往取相同的名字。
作用
保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據。使兩張表形成關聯,外鍵只能引用外表中的列的值或使用空值。
學號在成績表(表2)中是主鍵,在學生表(表1)中是外鍵。如果不使用外鍵,表1的學號字段插了一個值(比如20140999999),但是這個值在表2中并沒有,這個時候,數據庫允許插入,并不會對插入的數據做關系檢查。然而在設置外鍵的情況下,插入表1學號字段的值必須要求在表1的學號字段能找到。同時,如果要刪除表2的某個學號字段,必須保證表2中沒有引用該字段值的列,否則就沒法刪除。這就是所謂的保持數據的一致性和完整性。如圖1,如果表1還引用表2的某個學號,卻把表1中的這個學號刪了,表2就不知道這個學號對應的學生是哪個學生。
數據庫中的表必須符合規范,才能杜絕數據冗余、插入異常、刪除異常等現象。規范的過程是分解表的過程。經過分解,同一事物的代表屬性出現在不同的表中。顯然,它們應該保持一致。外鍵的值或者是另外一個表的主鍵值或者為空值。學號在學生表里是主鍵,在成績表里是外鍵。成績表里的學號一定要是學生表里的學號。于是,學生表里的學號和成績表里的學號就一致了。可以直觀地理解,外鍵的功能是實現同一事物在不同表中的標志一致性。功能的實現由外鍵聯系的兩個表,在單獨操作時,外鍵功能由兩種方法實現:
阻止執行
級聯執行
兩種實現方法,通過下面方式選擇:
參考資料 >