本文介紹如何在 Microsoft Access 數(shù)據(jù)庫(kù)中定義關(guān)系。包括以下主題:
- 什么是表關(guān)系
- 表關(guān)系的類型
- 一對(duì)多關(guān)系
- 多對(duì)多關(guān)系
- 一對(duì)一關(guān)系
- 如何定義表之間的關(guān)系
- 如何定義一對(duì)多或一對(duì)一關(guān)系
- 如何定義多對(duì)多關(guān)系
- 引用完整性
- 級(jí)聯(lián)更新和刪除
- 聯(lián)接類型
什么是表關(guān)系
在關(guān)系數(shù)據(jù)庫(kù)中,通過(guò)關(guān)系您可以防止出現(xiàn)重復(fù)數(shù)據(jù)。例如,如果您在設(shè)計(jì)一個(gè)跟蹤書(shū)籍相關(guān)信息的數(shù)據(jù)庫(kù),您可能有一個(gè)名為“書(shū)籍”的表,該表存儲(chǔ)每種書(shū)籍的相關(guān)信息,例如書(shū)名、出版日期和出版商。您可能還想存儲(chǔ)有關(guān)出版商的信息,例如出版商的電話號(hào)碼、地址及郵政編碼。如果將所有這些信息都存儲(chǔ)在“書(shū)籍”表中,對(duì)于出版商出版的每種書(shū)籍,該出版商的電話號(hào)碼將是重復(fù)的。
更好的解決方案是,只需將出版商信息在單獨(dú)的表“出版商”中存儲(chǔ)一次。然后在“書(shū)籍”表中放置一個(gè)指針,該指針引用“出版商”表中的一項(xiàng)。
為了確保數(shù)據(jù)保持同步,可以在“書(shū)籍”和“出版商”表之間強(qiáng)制執(zhí)行引用完整性。引用完整性關(guān)系有助于確保一個(gè)表中的信息與另一個(gè)表中的信息相匹配。例如,“書(shū)籍”表中的每種書(shū)籍必須與“出版商”表內(nèi)的某個(gè)特定出版商關(guān)聯(lián)。對(duì)于數(shù)據(jù)庫(kù)中不存在的出版商,無(wú)法向數(shù)據(jù)庫(kù)中添加相應(yīng)書(shū)籍。
表關(guān)系的類型
關(guān)系是通過(guò)匹配鍵列(通常是兩個(gè)表中的同名列)中的數(shù)據(jù)來(lái)工作。大多數(shù)情況下,關(guān)系將一個(gè)表中的主鍵(為每一行提供唯一標(biāo)識(shí)符)與另一個(gè)表內(nèi)外鍵中的項(xiàng)匹配。例如,通過(guò)在“書(shū)籍”表中的 title_id 列(主鍵)和“銷售額”表中的 title_id 列(外鍵)之間創(chuàng)建關(guān)系,可以將銷售額與所售的特定書(shū)籍相關(guān)聯(lián)。
表之間有三種類型的關(guān)系。所創(chuàng)建關(guān)系的類型取決于相關(guān)列的定義方式。
一對(duì)多關(guān)系
一對(duì)多關(guān)系是最常見(jiàn)的關(guān)系類型。在此類型的關(guān)系中,表 A 中的一行在表 B 中可以有多個(gè)匹配行,但表 B 中的一行在表 A 中只能有一個(gè)匹配行。例如,“出版商”表和“書(shū)籍”表具有一對(duì)多關(guān)系:每家出版商可以出版多種書(shū)籍,而每種書(shū)籍只能來(lái)自一家出版商。
如果只有其中一個(gè)相關(guān)列是主鍵或者具有唯一約束,則會(huì)創(chuàng)建一對(duì)多關(guān)系。
在 Access 中,一對(duì)多關(guān)系的主鍵側(cè)由鍵符號(hào)表示。關(guān)系的外鍵側(cè)由無(wú)窮符號(hào)表示。
多對(duì)多關(guān)系
在多對(duì)多關(guān)系中,表 A 中的一行在表 B 中可以有多個(gè)匹配行,反之亦然。通過(guò)定義稱為聯(lián)接表的第三個(gè)表可以創(chuàng)建這種關(guān)系,聯(lián)接表的主鍵由表 A 和表 B 中的外鍵組成。例如,“作者”表和“書(shū)籍”表具有多對(duì)多關(guān)系,該關(guān)系由這兩個(gè)表與“書(shū)籍作者”表之間的一對(duì)多關(guān)系定義?!皶?shū)籍作者”表的主鍵是 au_id 列(“作者”表的主鍵)和 title_id 列(“書(shū)籍”表的主鍵)的組合。
一對(duì)一關(guān)系
在一對(duì)一關(guān)系中,表 A 中的一行在表 B 中只能有一個(gè)匹配行,反之亦然。如果兩個(gè)相關(guān)列都是主鍵或者都有唯一約束,則會(huì)創(chuàng)建一對(duì)一關(guān)系。
此類型的關(guān)系不常見(jiàn),因?yàn)槎鄶?shù)通過(guò)此方法相關(guān)的信息都會(huì)在一個(gè)表內(nèi)??梢允褂靡粚?duì)一關(guān)系執(zhí)行下列操作:
- 將表分為多列。
- 出于安全考慮將表的一部分隔離。
- 存儲(chǔ)短期的且僅通過(guò)刪除表即可輕易刪除的數(shù)據(jù)。
- 存儲(chǔ)僅應(yīng)用于主表子集的信息。
在 Access 中,一對(duì)一關(guān)系的主鍵側(cè)由鍵符號(hào)表示。外鍵側(cè)也由鍵符號(hào)表示。
如何定義表之間的關(guān)系
在表之間創(chuàng)建關(guān)系時(shí),相關(guān)字段不一定必須具有相同名稱。但是,相關(guān)字段必須具有相同的數(shù)據(jù)類型,除非主鍵字段是自動(dòng)編號(hào)字段。僅當(dāng)兩個(gè)匹配字段的
FieldSize 屬性相同時(shí),才可以將自動(dòng)編號(hào)字段與數(shù)字字段匹配。例如,如果自動(dòng)編號(hào)字段和數(shù)字字段的
FieldSize 屬性是長(zhǎng)整型,您就可以將這兩個(gè)字段匹配。即使當(dāng)兩個(gè)匹配字段都是數(shù)字字段時(shí),它們?nèi)员仨毦哂邢嗤?nbsp;
FieldSize 屬性設(shè)置。
如何定義一對(duì)多或一對(duì)一關(guān)系
要?jiǎng)?chuàng)建一對(duì)多或一對(duì)一關(guān)系,請(qǐng)按照下列步驟操作:
- 關(guān)閉已打開(kāi)的所有表。無(wú)法創(chuàng)建或修改打開(kāi)的表之間的關(guān)系。
- 在 Access 2002 或 Access 2003 中,按照下列步驟操作:
- 按 F11 切換到“數(shù)據(jù)庫(kù)”窗口。
- 在“工具”菜單上,單擊“關(guān)系”。
在 Access 2007 中,單擊“數(shù)據(jù)庫(kù)工具”選項(xiàng)卡上的“顯示/隱藏”組中的“關(guān)系”。 - 如果尚未在數(shù)據(jù)庫(kù)中定義任何關(guān)系,則“顯示表”對(duì)話框自動(dòng)顯示。如果要添加想要相關(guān)的表,但“顯示表”對(duì)話框未顯示,請(qǐng)單擊“關(guān)系”菜單上的“顯示表”。
- 雙擊想要相關(guān)的表的名稱,然后關(guān)閉“顯示表”對(duì)話框。要在表與其自身之間創(chuàng)建關(guān)系,請(qǐng)將該表添加兩次。
- 將想要相關(guān)的字段從一個(gè)表中拖至另一個(gè)表中的相關(guān)字段。要拖動(dòng)多個(gè)字段,請(qǐng)按住 Ctrl 并單擊每個(gè)字段,然后拖動(dòng)它們。
大多數(shù)情況下,您將主鍵字段(以粗體文本顯示)從一個(gè)表中拖至另一個(gè)表中稱為外鍵的類似字段(通常具有相同名稱)。 - “編輯關(guān)系”對(duì)話框?qū)⒊霈F(xiàn)。確保顯示在兩列中的字段名稱是正確的。必要時(shí)可以更改它們。
如果需要,可以設(shè)置關(guān)系選項(xiàng)。如果需要有關(guān)“編輯關(guān)系”對(duì)話框中的某個(gè)特定項(xiàng)的信息,請(qǐng)單擊問(wèn)號(hào)按鈕,然后單擊該項(xiàng)。這些選項(xiàng)將在本文的后面部分詳細(xì)介紹。 - 單擊“創(chuàng)建”創(chuàng)建關(guān)系。
- 對(duì)想要相關(guān)的每一對(duì)表重復(fù)步驟 5 到步驟 8。
關(guān)閉“編輯關(guān)系”對(duì)話框時(shí),Microsoft Access 將詢問(wèn)您是否要保存布局。不管是否保存布局,您創(chuàng)建的關(guān)系都會(huì)保存在數(shù)據(jù)庫(kù)中。
注意:可以在查詢以及表中創(chuàng)建關(guān)系。然而,引用完整性對(duì)查詢不是強(qiáng)制執(zhí)行的。
如何定義多對(duì)多關(guān)系
要?jiǎng)?chuàng)建多對(duì)多關(guān)系,請(qǐng)按照下列步驟操作:
- 創(chuàng)建兩個(gè)將具有多對(duì)多關(guān)系的表。
- 創(chuàng)建稱為聯(lián)接表的第三個(gè)表,然后向聯(lián)接表中添加與其他兩個(gè)表中的每個(gè)表內(nèi)的主鍵字段具有相同定義的新字段。在聯(lián)接表內(nèi),主鍵字段作為外鍵。與其他任何表一樣,您可以向聯(lián)接表中添加其他字段。
- 在聯(lián)接表中,設(shè)置主鍵以包括其他兩個(gè)表中的主鍵字段。例如,在聯(lián)接表“書(shū)籍作者”中,主鍵將由“訂單 ID”和“產(chǎn)品 ID”字段組成。
注意:要?jiǎng)?chuàng)建一個(gè)主鍵,請(qǐng)按照下列步驟操作:- 在“設(shè)計(jì)”視圖中打開(kāi)一個(gè)表。
- 選擇要定義為主鍵的一個(gè)或多個(gè)字段。要選擇一個(gè)字段,請(qǐng)單擊所需字段的行選擇器。
要選擇多個(gè)字段,請(qǐng)按住 Ctrl 鍵,然后單擊每個(gè)字段的行選擇器。 - 在 Access 2002 或 Access 2003 中,單擊工具欄上的“主鍵”。
在 Access 2007 中,單擊“設(shè)計(jì)”選項(xiàng)卡上“工具”組中的“主鍵”。
注意:如果希望多字段主鍵中字段的順序與表中這些字段的順序不同,請(qǐng)單擊工具欄上的“索引”以顯示“索引”對(duì)話框,然后對(duì)名為 PrimaryKey 的索引的字段名稱重新排序。
- 在兩個(gè)主表中的每一個(gè)主表與聯(lián)接表之間定義一個(gè)一對(duì)多關(guān)系。
引用完整性
引用完整性是一套規(guī)則,Microsoft Access 使用它確保相關(guān)表中的記錄之間的關(guān)系有效,并保證您不會(huì)無(wú)意間刪除或更改相關(guān)的數(shù)據(jù)。當(dāng)符合下列所有條件時(shí),您可以設(shè)置引用完整性:
- 主表中的匹配字段是主鍵或者具有唯一索引。
- 相關(guān)字段具有相同數(shù)據(jù)類型。但有兩種例外情況。自動(dòng)編號(hào)字段可以和 FieldSize 屬性設(shè)置為長(zhǎng)整型的數(shù)字字段相關(guān),并且FieldSize 屬性設(shè)置為 Replication ID 的自動(dòng)編號(hào)字段可以和 FieldSize 屬性設(shè)置為 Replication ID 的數(shù)字字段相關(guān)。
- 兩個(gè)表屬于同一 Microsoft Access 數(shù)據(jù)庫(kù)。如果表是鏈接表,則它們必須為 Microsoft Access 格式,并且您必須打開(kāi)存儲(chǔ)表的數(shù)據(jù)庫(kù)以便設(shè)置引用完整性。無(wú)法為其他格式的數(shù)據(jù)庫(kù)中的鏈接表強(qiáng)制執(zhí)行引用完整性。
當(dāng)您使用引用完整性時(shí),以下規(guī)則適用:
- 不可以在主表的主鍵中不存在的相關(guān)表外鍵字段中輸入值。不過(guò),您可以在外鍵中輸入一個(gè) Null 值以指定這些記錄不相關(guān)。例如,不能有一個(gè)分配給不存在客戶的訂單,但是通過(guò)在“客戶 ID”字段中輸入一個(gè) Null 值可以有未分配給任何人的訂單。
- 如果一個(gè)記錄在相關(guān)的表中存在匹配的記錄,則不能夠從主表中刪除該記錄。例如,如果在“訂單”表中有分配給某個(gè)員工的訂單,則您不能夠從“員工”表中刪除該員工記錄。
- 如果一個(gè)記錄有相關(guān)的記錄,則您不能在主表中更改其主鍵值。例如,如果在“訂單”表中有分配給某一員工的訂單,則您不能夠在“員工”表中更改此員工的 ID。
級(jí)聯(lián)更新和刪除
對(duì)于強(qiáng)制執(zhí)行了引用完整性的關(guān)系,您可以指定是否希望 Microsoft Access 自動(dòng)級(jí)聯(lián)更新或級(jí)聯(lián)刪除相關(guān)的記錄。如果設(shè)置了這些選項(xiàng),則通常由引用完整性規(guī)則阻止的刪除和更新操作將能夠進(jìn)行。當(dāng)您在主表中刪除記錄或更改主鍵值時(shí),Microsoft Access 將對(duì)相關(guān)表進(jìn)行必要的更改以保持引用完整性。
如果您在定義關(guān)系時(shí)單擊選中了“級(jí)聯(lián)更新相關(guān)字段”復(fù)選框,則每當(dāng)您更改主表中記錄的主鍵時(shí),Microsoft Access 就會(huì)自動(dòng)將所有相關(guān)記錄中的主鍵值更新為新值。例如,如果您更改“客戶”表中的客戶 ID,則“訂單”表中該客戶的每一個(gè)訂單的“客戶 ID”字段都會(huì)自動(dòng)更新,這樣就不會(huì)破壞關(guān)系。Microsoft Access 執(zhí)行級(jí)聯(lián)更新時(shí)不顯示任何消息。
注意:如果主表中的主鍵是一個(gè)自動(dòng)編號(hào)字段,則選中“級(jí)聯(lián)更新相關(guān)字段”復(fù)選框?qū)⒉黄鹱饔?,因?yàn)椴荒芨淖詣?dòng)編號(hào)字段中的值。
如果您在定義關(guān)系時(shí)選中了“級(jí)聯(lián)刪除相關(guān)記錄”復(fù)選框,則每當(dāng)您刪除主表中的記錄時(shí),Microsoft Access 就會(huì)自動(dòng)刪除相關(guān)表中的相關(guān)記錄。例如,如果您從“客戶”表中刪除一個(gè)客戶記錄,則該客戶的所有訂單會(huì)自動(dòng)從“訂單”表(包括與“訂單”記錄相關(guān)的“訂單明細(xì)”表中的記錄)中刪除。當(dāng)您在選中“級(jí)聯(lián)刪除相關(guān)記錄”復(fù)選框的情況下從窗體或數(shù)據(jù)表中刪除記錄時(shí),Microsoft Access 會(huì)警告您相關(guān)記錄也可能會(huì)被刪除。然而,當(dāng)您使用刪除查詢刪除記錄時(shí),Microsoft Access 將自動(dòng)刪除相關(guān)表中的記錄而不顯示警告。
聯(lián)接類型
有三種聯(lián)接類型,如下所示:
選項(xiàng) 1 定義一個(gè)內(nèi)部聯(lián)接。內(nèi)部聯(lián)接是一種聯(lián)接,其中僅當(dāng)聯(lián)接字段中的值滿足指定條件時(shí)才將兩個(gè)表中的記錄合并到查詢結(jié)果中。在查詢中,默認(rèn)聯(lián)接是內(nèi)部聯(lián)接,僅當(dāng)聯(lián)接字段中的值匹配時(shí)該內(nèi)部聯(lián)接才選擇記錄。
選項(xiàng) 2 定義一個(gè)左外部聯(lián)接。左外部聯(lián)接是一種聯(lián)接,其中查詢的 SQL 語(yǔ)句中 LEFT JOIN 操作左側(cè)的所有記錄被添加到查詢結(jié)果中,即使右側(cè)表中聯(lián)接字段內(nèi)沒(méi)有匹配值也會(huì)如此。
選項(xiàng) 3 定義一個(gè)右外部聯(lián)接。右外部聯(lián)接是一種聯(lián)接,其中查詢的 SQL 語(yǔ)句中 RIGHT JOIN 操作右側(cè)的所有記錄被添加到查詢結(jié)果中,即使左側(cè)表中聯(lián)接字段內(nèi)沒(méi)有匹配值也會(huì)如此。