如何定義 Access 資料庫中數據表之間的關聯性
原始 KB 編號: 304466
注意事項
新手:需要在單一用戶計算機上了解使用者介面。 本文僅適用於 Microsoft Access 資料庫 (.mdb 或 .accdb) 。
摘要
本文說明如何在 Microsoft Access 資料庫中定義關聯性。 本文包含下列主題:
- 什麼是數據表關聯性?
- 數據表關聯性的種類
- 一對多關聯性
- 多對多關聯性
- 一對一關聯性
- 如何定義數據表之間的關聯性
- 如何定義一對多或一對一關係
- 如何定義多對多關聯性
- 引用完整性
- 串聯更新和刪除
- 聯結類型
什麼是數據表關聯性?
在關係資料庫中,關聯性可讓您防止備援數據。 例如,如果您要設計將追蹤書籍相關信息的資料庫,您可能會有一個名為 「Titles」 的數據表,其中儲存每本書的相關信息,例如書籍的標題、發行日期和發行者。 另外還有您可能想要儲存的發行者相關信息,例如發行者的電話號碼、位址和郵遞編碼。 如果您要將所有這些資訊儲存在 「標題」數據表中,則發行者的電話號碼會針對發行者列印的每個標題重複。
更好的解決方案是只將發行者的資訊儲存一次,並儲存在我們將稱為「發行者」的個別數據表中。然後,您會將指標放在 「Titles」 資料表中,該數據表會參考 「Publishers」 資料表中的專案。
若要確保資料保持同步,您可以在數據表之間強制執行引用完整性。 引用完整性關聯性有助於確保一個數據表中的資訊符合另一個數據表中的資訊。 例如,「Titles」 數據表中的每個標題都必須與 「Publishers」 資料表中的特定發行者相關聯。 對於資料庫中不存在的發行者,無法將標題新增至資料庫。
資料庫中的邏輯關聯性可讓您有效率地查詢數據並建立報表。
數據表關聯性的種類
關聯性的運作方式是比對索引鍵數據行中的數據,通常是數據行 (或兩個數據表中名稱相同的欄位) 。 在大部分情況下,關聯性會將主鍵或每個數據列的唯一標識符數據行,從一個數據表連接到另一個數據表中的字段。 另一個數據表中的數據行稱為「外鍵」。例如,如果您想要追蹤每個書名的銷售量,您會在主鍵數據行之間建立關聯性 (讓我們將它稱為 title_ID) “Titles” 數據表和 “Sales” 數據表中名為 title_ID 的數據行。 “Sales” 資料表中的 title_ID 資料行是外鍵。
數據表之間有三種關聯性。 建立的關聯性種類取決於相關數據行的定義方式。
一對多關聯性
一對多關聯性是最常見的關聯性類型。 在這種關聯性中,數據表 A 中的數據列在數據表 B 中可以有許多相符的數據列。但是,數據表 B 中的數據列在數據表 A 中只能有一個相符的數據列。例如,“Publishers” 和 “Titles” 數據表具有一對多關聯性。 也就是說,每個發行者都會產生許多標題。 但每個標題都只來自一個發行者。
如果只有其中一個相關數據行是主鍵或具有唯一條件約束,就會建立一對多關聯性。
在 Access 的關聯性視窗中,一對多關聯性的主鍵端會以數位 1 表示。 關聯性的外鍵端會以無限符號表示。
多對多關聯性
在多對多關聯性中,數據表 A 中的數據列在數據表 B 中可以有許多相符的數據列,反之亦然。 您可以藉由定義稱為連接數據表的第三個數據表來建立這類關聯性。 連接數據表的主鍵是由數據表 A 和數據表 B 的外鍵所組成。例如,“Authors” 數據表和 “Titles” 數據表具有多對多關聯性,由從每個數據表到 “TitleAuthors” 數據表的一對多關聯性所定義。 “TitleAuthors” 數據表的主鍵是 au_ID 數據行的組合, (“Authors” 數據表的主鍵) ,以及 title_ID 數據行 (“Titles” 數據表的主鍵) 。
一對一關聯性
在一對一關聯性中,數據表 A 中的數據列在數據表 B 中不能有一個以上的相符數據列,反之亦然。 如果兩個相關數據行都是主鍵或具有唯一條件約束,就會建立一對一關聯性。
這種關聯性並不常見,因為以這種方式相關的大部分信息都會在一個數據表中。 您可以使用一對一關聯性來採取下列動作:
- 分割具有許多數據行的數據表。
- 基於安全性考慮,隔離數據表的一部分。
- 儲存短期且可藉由刪除數據表輕鬆刪除的數據。
- 儲存僅適用於主數據表子集的資訊。
在 Access 中,一對一關聯性的主鍵端會以索引鍵符號表示。 外鍵端也會以索引鍵符號表示。
如何定義數據表之間的關聯性
當您在數據表之間建立關聯性時,相關的欄位不需要有相同的名稱。 不過,除非主鍵欄位是自動編號欄位,否則相關欄位必須具有相同的數據類型。 只有當兩個相符欄位的FieldSize 屬性相同時,您才能比對 AutoNumber 字段與 Number 字段。 例如,如果這兩個字段的FieldSize 屬性都是Long Integer,您可以比對 AutoNumber 字段和 Number 字段。 即使兩個相符的欄位都是 [數位] 欄位,它們也必須具有相同的FieldSize 屬性設定。
如何定義一對多或一對一關係
若要建立一對多或一對一關係,請遵循下列步驟:
關閉所有數據表。 您無法在開啟的數據表之間建立或變更關聯性。
在 Access 2002 或 Access 2003 中,遵循下列步驟:
- 按 F11 切換至 [資料庫] 視窗。
- 在 [ 工具] 功能表上,按兩下 [ 關聯性]。
在 Access 2007、Access 2010 或 Access 2013 中,按兩下 [資料庫工具] 索引卷標上 [顯示/隱藏] 群組中的 [關聯性]。
如果您尚未在資料庫中定義任何關聯性,則會自動顯示 [ 顯示數據表 ] 對話方塊。 如果您想要新增要關聯的數據表,但 [顯示數據表] 對話框未出現,請按兩下 [關聯性] 選單上的 [顯示資料表]。
按兩下您要關聯的數據表名稱,然後關閉 [ 顯示資料表 ] 對話框。 若要建立數據表與本身之間的關聯性,請新增該數據表兩次。
將您要關聯的欄位從一個資料表拖曳到另一個數據表中的相關字段。 若要拖曳多個字段,請按 Ctrl,按一下每個欄位,然後拖曳它們。
在大部分情況下,您會將主鍵欄位拖曳 (此欄位會以粗體文字) 從一個數據表拖曳到類似的欄位 (此欄位的名稱通常與另一個數據表中稱為外鍵的) 相同。
[ 編輯關聯性] 對話框隨即出現。 請確定兩個數據行中顯示的功能變數名稱正確無誤。 如有必要,您可以變更名稱。
視需要設定關聯性選項。 如果您必須在 [ 編輯 關聯性] 對話框中擁有特定專案的相關信息,請按兩下問號按鈕,然後按兩下該專案。 (本文稍後將詳細說明這些選項。)
按兩下 [建立 ] 以建立關聯性。
針對您想要建立關聯的每對數據表重複步驟 4 到 7。
當您關閉 [ 編輯關聯性 ] 對話框時,Access 會詢問您是否要儲存版面配置。 無論您是儲存版面配置還是不儲存版面配置,您建立的關聯性都會儲存在資料庫中。
注意事項
您不僅可以在數據表中建立關聯性,也可以在查詢中建立關聯性。 不過,查詢不會強制執行引用完整性。
如何定義多對多關聯性
若要建立多對多關聯性,請遵循下列步驟:
建立將具有多對多關聯性的兩個數據表。
建立第三個數據表。 這是連接數據表。 在連線數據表中,新增與您在步驟 1 中建立之每個數據表中主鍵欄位具有相同定義的新欄位。 在連接數據表中,主鍵欄位會作為外鍵。 您可以將其他欄位新增至連接資料表,就如同任何其他數據表一樣。
在連接資料表中,將主鍵設定為包含其他兩個數據表中的主鍵字段。 例如,在 「TitleAuthors」 連接表中,主鍵會由 OrderID 和 ProductID 字 段組成。
注意事項
若要建立主鍵,請遵循下列步驟:
在 [設計] 檢視中開啟數據表。
選取您要定義為主鍵的欄位。 若要選取一個字段,請按下所需欄位的數據列選取器。 若要選取多個字段,請按住 Ctrl 鍵,然後按下每個欄位的數據列選取器。
在 Access 2002 或 Access 2003 中,按兩下工具列上的 [主要金鑰 ]。
在 Access 2007 中,按兩下 [設計] 索引標籤上 [工具] 群組中的 [主要密鑰]。
注意事項
如果您想要讓多欄位主鍵中的欄位順序與資料表中這些欄位的順序不同,請按兩下工具列上的 [索引] 來顯示 [索引] 對話框,然後重新排列名為 PrimaryKey 之索引的功能變數名稱。
定義每個主數據表與連接數據表之間的一對多關聯性。
引用完整性
引用完整性是一種規則系統,Access 會使用此系統來確保相關數據表中記錄之間的關聯性有效,而且您不會不小心刪除或變更相關數據。 當下列所有條件都成立時,您可以設定引用完整性:
- 主數據表中的相符欄位是主鍵或具有唯一索引。
- 相關欄位具有相同的數據類型。 有兩個例外狀況。
[自動編號] 字段可以與屬性
FieldSize
設定為 [長整數] 的 [數位] 字段相關,而具有FieldSize
[復寫標識符] 屬性設定的 [自動編號] 字段可以與 [編號] 字段相關,該欄位的FieldSize
屬性設定為 [復寫標識符]。 - 這兩個數據表都屬於相同的 Access 資料庫。 如果數據表是鏈接數據表,它們必須是 Access 格式的數據表,而且您必須開啟儲存它們的資料庫,以設定引用完整性。 無法針對資料庫中其他格式的鏈接資料表強制執行引用完整性。
當您使用參考完整性時,適用下列規則:
- 您無法在相關資料表的外鍵欄位中輸入不存在於主資料表主鍵中的值。 不過,您可以在外鍵中輸入 Null 值。 這會指定記錄不相關。 例如,您不能將訂單指派給不存在的客戶。 不過,您可以在 CustomerID 字段中輸入 Null 值,將訂單指派給沒有人。
- 如果相關資料表中有相符的記錄,您就無法從主數據表刪除記錄。 例如,如果 「Orders」 資料表中有指派給員工的訂單,您就無法從 「Employees」 資料表中刪除員工記錄。
- 如果主數據表中的主鍵值有相關的記錄,您就無法變更該記錄。 例如,如果 「Orders」 資料表中有指派給該員工的訂單,您就無法變更 「Employees」 資料表中的員工識別碼。
串聯更新和刪除
對於強制執行引用完整性的關聯性,您可以指定 Access 自動串聯更新或串聯刪除相關記錄。 如果您設定這些選項,則會啟用通常會由引用完整性規則防止的刪除和更新作業。 當您刪除記錄或變更主數據表中的主鍵值時,Access 會對相關數據表進行必要的變更,以保留引用完整性。
如果您在定義關聯性時按下以選取 [ 串聯更新相關欄位 ] 複選框,每當您變更主數據表中記錄的主鍵時,Microsoft Access 就會自動將主鍵更新為所有相關記錄中的新值。 例如,如果您在 「Customers」 資料表中變更客戶的標識碼,則 「Orders」 資料表中的 CustomerID 字段會針對該客戶的每一筆訂單自動更新,因此不會中斷關聯性。 存取串聯更新,而不顯示任何訊息。
注意事項
如果主數據表中的主鍵是 [自動編號] 欄位,則選取 [ 串聯更新相關 欄位] 複選框不會有任何作用,因為您無法變更 [自動編號] 字段中的值。
如果您在定義關聯性時選取 [ 串聯刪除相關 記錄] 複選框,每當您刪除主數據表中的記錄時,Access 就會自動刪除相關數據表中的相關記錄。 例如,如果您從 「Customers」 資料表刪除客戶記錄,則會自動從 「Orders」 資料表中刪除所有客戶的訂單。 (這包括與「訂單」記錄) 相關的「訂單詳細數據」數據表中的記錄。 當您在選取 [串 聯刪除相關 記錄] 複選框時,從窗體或數據工作表中刪除記錄時,Access 會警告您可能也會刪除相關的記錄。 不過,當您使用刪除查詢刪除記錄時,Access 會自動刪除相關數據表中的記錄,而不會顯示警告。
聯結類型
聯結類型有三種。 您可以在下列螢幕快照中看到它們:
選項 1 會定義內部聯結。 內部聯結是聯結,其中來自兩個數據表的記錄只有在聯結字段中的值符合指定的條件時,才會合併到查詢的結果中。 在查詢中,預設聯結是內部聯結,只有在聯結字段中的值相符時,才會選取記錄。
選項 2 會定義左方外部聯接。 左方外部聯接是聯結,其中查詢 SQL 語句中 LEFT JOIN 作業左邊的所有記錄都會加入查詢的結果,即使從右側的數據表聯結的欄位中沒有相符的值也一樣。
選項 3 會定義右方外部聯接。 右外部聯接是聯結,其中查詢 SQL 語句中 RIGHT JOIN 作業右側的所有記錄都會加入查詢的結果,即使左側數據表的聯結字段中沒有相符的值也一樣。