1. 程式人生 > >關於主鍵和外鍵

關於主鍵和外鍵

主表 通過 更新 控制 數據緩沖 計算機 wid 但是 detail

數據庫主鍵和外鍵

1 什麽是主鍵 外鍵

 學生表(學號,姓名,性別,班級)   學號是一個主鍵

 課程表(課程號,課程名,學分)    課程號是一個主鍵

 成績表(學號,課程號,成績)     學號和課程號的屬性組構成一個主鍵

 成績表中的學號不是成績表的主鍵,不過是學生表的主鍵,成績表的外鍵,同理課程號也是成績表的外鍵

 定義:如果公共關鍵字在一個關系中是主關鍵字,那麽這個公共關鍵字被稱為另一個關系的外鍵

 以一個關系的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表

2 外鍵的作用

 外鍵用於保持數據一致性,完整性

 主要目的是控制存儲在外鍵表中的數據

3 主鍵的設計原則

 1)主鍵應當是對用戶沒有意義的

 2)主鍵應該是單列的,以提高連接和篩選操作的效率

   復合鍵的使用通常出於兩點考慮:

    a)主鍵應當具有意義-----這為認為的破壞數據庫提供了方便

    b)在描述多對多關系的連接表中可以使用兩個外部鍵作為主鍵------該表可能成為其他從表的主表,並成為從表的主鍵的一部分,使得之後的從表包含更多的列

 3)永遠不要更新主鍵

 4)主鍵不應該包含動態變化的數據(時間戳等)

 5)主鍵應當由計算機自動生成

4 數據庫主鍵選取策略

 建立數據庫的時候,需要為每張表指定一個主鍵(一個表只能有一個主鍵,但是可以有多個候選索引)

 常見的主鍵選取方式有:

 1)自動增長型字段

  自動增長型主鍵會省略很多繁瑣的工作,但在數據緩沖模式下,不能預先填寫主鍵與外鍵的值

  Order(OrderID,OrderDate)   //主鍵OrderID是自動增長型字段

  OrderDetail(OrderID,LineNum,ProductID,Price)

  如果要在Order表中插入一條記錄,在OrderDetail表中插入若幹條記錄,為了能在OrderDetail表中插入正確的OrderID字段,必須先更新Order表以獲得系統系統分配的OrderID,但是為了確保數據一致性,Order表和OrderDetail表必須在事務保護下同時進行更新,這顯然是矛盾的

  除此之外,當需要在多個數據庫之間進行數據復制時,自動增長型字段可能造成主鍵沖突

 2)手動增長型字段

 3)使用UniqueIdentifier SQL Server提供一個UniqueIdentifier數據類型(16字節),並提供一個生成函數NEWID(),生成一個唯一的UniqueIdentifier

 4)使用COMB類型

  保留UniqueIdentifier的前10字節,後6字節表示生成時間

-------------------------------------------------------------------------------------------------------------------------------------------------------------

1 外鍵

 外鍵(FK)是用於建立或加強兩個表數據之間的鏈接的一列或多列。

 通過將表中主鍵值的一列或多列添加到另一個表中,可創建兩個表之間的連接,這個列就成為第二個表的外鍵

 FK約束的目的是控制存儲在外表中的數據,同時可以控制對主鍵表中數據的修改

 例如:publishers表中記錄出版商的信息,titles表中記錄書的信息,如果在publishers的表中刪除一個出版商,而這個出版商的ID在titles表中記錄書的信息時被使用了,則這兩個表之間關聯的完整性將被破壞,即titles表中該出版商的書籍因為與publisher表中的數據沒有鏈接而變的孤立。

 FK約束可以防止這種情況的發生,如果主鍵表中數據的更改使得與外鍵表中數據的鏈接失效,則這種更改是不能實現的;如果試圖刪除主鍵表中的行或試圖修改主鍵值,而該主鍵值與另一個表的FK約束值相關,則該操作不可實現。若要成功的更改或刪除FK約束的行,可以現在外鍵表中刪除外鍵數據或更改外鍵數據,然後將外鍵連接到不同的主鍵數據上去。

 外鍵主要是用來控制數據庫中的數據完整性的,當對一個表的數據進行操作時,和他有關聯的一個表或多個表的數據能夠同時發生改變 

 例子:

 A(a,b) :a為主鍵,b為外鍵(來自於B.b)

 B(b,c,d) :b為主鍵

 A中的b字段要麽為空,要麽為B表中存在的b值

關於主鍵和外鍵