詳談關聯式資料庫中的「鍵」(續)
今天我們來討論外來鍵。
從表通過指向主表的外來鍵來與主表相關聯。人們常犯的一種錯誤是:認為參照完整性是對於主鍵的約束。但實際上,參照完整性要求的是外鍵值必須引用有效的主鍵值,所以這項約束是對於外來鍵的約束,而不是對於主鍵的約束。
在 t-sql
指令碼中,可以使用兩種方法來宣告完整性約束:既可以在建立表的**中宣告完整性約束,也可以在建立表之後再建立約束。其宣告的格式如下:
foreignkeycolumn foreign key references primarytable(pkid)
可選的外來鍵與強制的外來鍵之間存在著很大的區別。一些關係的外來鍵必須具有值,但對於其他一些關係就不必如此,無論外來鍵有值或者沒有值,其資料都是有效的。在物理層,這種差別是通過外來鍵列能否為空體現出來的。如果外來鍵是強制的,那麼外來鍵列就不能允許輸入空值。相反,可選的外來鍵,在相應的列上允許輸入空值。對於具有複雜的可選性的關係,將需要通過check約束或者觸發器來全面地維護這種關係。
由參照完整性所帶來的一種複雜性是:如果從表中的記錄引用了主表中的一行記錄,那麼ri(referential integrity)將阻止對這一行記錄進行刪除操作,除非從表中引用了它的記錄都被刪除了。否則,如果刪除了主表中的這一行記錄,而從表中的那些記錄行仍舊指向這個剛被刪除的記錄的主鍵值,參照完整性就被破壞了。
解決這個問題的一種方法就是做級聯刪除操作。它將把主表中的記錄及其相關的從表中的記錄一起刪除,刪除的順序是:首先刪除從表中的相關記錄,然後再刪除主表中的記錄,因此它能夠維護參照完整性。在t-sql**中啟用級聯刪除選項的方法如下:
foreign key references dbo.[tablename] on delete cascade
在確定對於某個外來鍵是否要採用級聯刪除選項時,可以使用以下由實踐中總結出來的原則:
1. 如果從表中的資料必須與主表中的資料結合在一起才有意義,一旦脫離了主表中的資料便毫無意義,那麼應當使用級聯刪除。
2. 如果從表中的資料具有它自己的含義,那麼就不應該使用級聯刪除。
3. 如果外來鍵是可選的,那麼永遠也不要使用級聯刪除。
詳談關聯式資料庫中的「鍵」(續1)
1 天然主鍵 在現實生活中存在著許多看起來可以惟一地標識一行記錄的值,如 身份證號碼 汽車牌照號碼等。資料庫邏輯模式設計往往會使用這些天然的主鍵,儘管這些天然主鍵中沒有哪乙個是十分可靠的。可以讓使用者把它們當作查詢和命名一行記錄的 主鍵 但絕不能把它們作為實際的主鍵。如果必須使用乙個天然主鍵,則必須...
關聯式資料庫筆記2
選擇是從行的角度進行的運算 例如在學生表中選擇年齡大於18的元組 投影是從列的角度進行的運算 比如在學生表中只查詢學生的學號和姓名 注意點 投影之後不僅會取消原關係中的某些列,還可能會取消某些元組。從廣義笛卡爾積中選取在a屬性 r關係 值上的與b屬性組 s關係 上的值滿足比較關係的元組。等值連線 行...
資料庫複習 2 關聯式資料庫
關聯式資料庫由關係資料結構 關係操作集合和完整性約束組成。關係模型的資料結構只包含關係。具有相同資料型別值的集合 集合運算 關係是笛卡爾積的有限子集,關係也是乙個二維表。對每列起乙個名字,稱為屬性 關係中能唯一標識元組的屬性組稱為候選碼 候選碼的屬性稱為主屬性 選乙個候選碼作為主碼 所有屬性都是候選...