外鍵如何使用
外鍵如何使用
外鍵表示了兩個(gè)關(guān)系之間的相關(guān)聯(lián)系。以另一個(gè)關(guān)系的外鍵作主關(guān)鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。以下是由學(xué)習(xí)啦小編整理關(guān)于什么是外鍵的內(nèi)容,希望大家喜歡!
外鍵的定義
設(shè)F是基本關(guān)系R的一個(gè)或一組屬性,但不是關(guān)系的鍵,Ks是基本關(guān)系S的主鍵。如果F與Ks相對(duì)應(yīng),則稱F是R的外鍵,并稱基本關(guān)系R為參照關(guān)系,基本關(guān)系S為被參照關(guān)系或目標(biāo)關(guān)系。
換而言之,如果關(guān)系模式R中的某屬性集不是R的主鍵,而是另一個(gè)關(guān)系R1的主鍵則該屬性集是關(guān)系模式R的外鍵,通常在數(shù)據(jù)庫設(shè)計(jì)中縮寫為FK。
在實(shí)際操作中,將一個(gè)表的值放入第二個(gè)表來表示關(guān)聯(lián),所使用的值是第一個(gè)表的主鍵值(在必要時(shí)可包括復(fù)合主鍵值)。此時(shí),第二個(gè)表中保存這些值的屬性稱為外鍵(foreign key)。
注意
顯然目標(biāo)關(guān)系的主碼和參照關(guān)系的外碼必須定義在一個(gè)或同一組的域上。
關(guān)系R和S不一定是不同的關(guān)系,即外鍵不一定要與相應(yīng)的主鍵同名。如在學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡,班長(zhǎng))關(guān)系中,“學(xué)號(hào)”是主鍵,“班長(zhǎng)”屬性表示該學(xué)生所在編輯的班長(zhǎng)的學(xué)號(hào),它引用了本關(guān)系中“學(xué)號(hào)”屬性,因此“班長(zhǎng)”是外鍵,這里學(xué)生關(guān)系既是參照關(guān)系也是被參照關(guān)系。不過在實(shí)際應(yīng)用中為了便于識(shí)別,當(dāng)主鍵與相應(yīng)的外鍵屬于不同關(guān)系時(shí),往往取相同的名字。
作用
保持?jǐn)?shù)據(jù)一致性,完整性,主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù)。 使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值或使用空值。
如果不使用外鍵,表2的學(xué)號(hào)字段插了一個(gè)值(比如20140999999),但是這個(gè)值在表1中并沒有,這個(gè)時(shí)候,數(shù)據(jù)庫允許插入,并不會(huì)對(duì)插入的數(shù)據(jù)做關(guān)系檢查。然而在設(shè)置外鍵的情況下,你插入表2學(xué)號(hào)字段的值必須要求在表1的學(xué)號(hào)字段能找到。 同時(shí),如果你要?jiǎng)h除表1的某個(gè)學(xué)號(hào)字段,必須保證表2中沒有引用該字段值的列,否則就沒法刪除。這就是所謂的保持?jǐn)?shù)據(jù)的一致性和完整性。如右圖,如果表2還引用表1的某個(gè)學(xué)號(hào),你卻把表1中的這個(gè)學(xué)號(hào)刪了,表2就不知道這個(gè)學(xué)號(hào)對(duì)應(yīng)的學(xué)生是哪個(gè)學(xué)生。
外鍵的使用方法
主鍵表和外建表:
使用設(shè)計(jì)界面創(chuàng)建外鍵時(shí),出現(xiàn)主鍵表和外建表問題,上述使個(gè)人理解有誤:
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 為外鍵表。
總結(jié):主鍵表是被引用的表,外鍵表是引用其他表的表。
外鍵的有效性
有很多時(shí)候,程序員會(huì)發(fā)現(xiàn)字段缺少、多余問題或者是創(chuàng)建外鍵以后就不能添加沒有受約束的行[特殊情況下是有必要的],這個(gè)時(shí)候不想對(duì)表結(jié)構(gòu)進(jìn)行操作,就可以使用約束失效。
以 Northwind 為例:想給產(chǎn)品表【Products表】添加一條不受種類表【Categories表】限制的數(shù)據(jù)。可以使產(chǎn)品表中的 Categories 約束失效。
寫法:ALTER TABLE dbo.Products NOCHECKCONSTRAINT FK_Products_Categories
添加完成后再使其有效:
ALTER TABLE dbo.Products CHECK CONSTRAINT FK_Products_Categories
這樣就完成不受某表約束的數(shù)據(jù)添加了。
還有一個(gè)好處是:如上述例子。修改 Categories 表時(shí) 添加字段時(shí) 要把所有引用 Categories 表的外鍵給失效。等給 Categories 表添加字段完成后再使所有應(yīng)用 Categories 表的外鍵恢復(fù)有效性即可。
看過“外鍵如何使用”的人還看了: