如何定义 Access 数据库中的表之间的关系

原始 KB 编号: 304466

注意

初学者:需要了解单用户计算机上的用户界面。 本文仅适用于 Microsoft Access 数据库(.mdb 或 .accdb)。

摘要

本文介绍如何在 Microsoft Access 数据库中定义关系。 本文包括以下主题:

  • 什么是表关系?
  • 表关系的分类
    • 一对多关系
    • 多对多关系
    • 一对一关系
  • 如何定义表之间的关系
    • 如何定义一对多或一对一关系
    • 如何定义多对多关系
  • 引用完整性
  • 级联更新和删除
  • 联接类型

什么是表关系?

在关系数据库中,关系能够防止数据冗余。 例如,如果你要设计一个数据库来跟踪有关书籍的信息,你可能会有一个名为“Titles”的表,该表存储有关每本书的信息,例如书的标题、出版日期和出版商。 可能还要存储一些关于出版商的信息,例如出版商的电话号码、地址和邮政编码。 如果要将所有这些信息都存储在“Titles”表中,每次出版商打印标题时,出版商电话号码就会出现重复。

更好的解决方案是仅将发布者的信息存储在一个单独的表中,我们将该表称为“Publishers”。然后,将指针放在引用“Publishers”表中的条目的“Titles”表中。

若要确保数据保持同步,可以在表之间强制实施引用完整性。 引用完整性关系可帮助确保一个表中的信息与另一个表中的信息匹配。 例如,“Titles”表中的每个标题都必须与“Publishers”表中的特定出版商相关联。 如果数据库中不存在某个出版商,就不能向数据库中添加其对应的标题。

利用数据库中的逻辑关系,可以高效地查询数据和创建报告。

表关系的分类

关系的工作方式是匹配键列中的数据,这些列通常是两个表中同名的列(或字段)。 在大多数情况下,关系将一个表中的主键或每行的唯一标识符连接到另一个表中的字段。 另一个表中的列称为“外键”。例如,如果要跟踪每个书名的销售额,请在主键列 (title_ID“Titles”表中 的) 和 “Sales”表中名为 title_ID的列之间创建关系。 “Sales”表的 title_ID 列属于外键。

表之间有三种类型的关系。 创建的关系类型取决于相关列的定义方式。

一对多关系

一对多关系是最常见的关系类型。 在此类关系中,表 A 中的行可以在表 B 中具有许多匹配的行。但表 B 中的行在表 A 中只能有一个匹配的行。例如,“Publishers”表和“Titles”表具有一对多关系。 也就是说,每个出版商都对应许多标题。 但是每个标题仅关联一个出版商。

如果只有一个相关列是主键或具有唯一约束,则创建一对多关系。

在 Access 的关系窗口中,一对多关系的主键端用数字 1 表示。 关系的外键端由无穷大符号表示。

Access 关系窗口中一对多关系示例的屏幕截图。

多对多关系

在多对多关系中,表 A 中的行可在表 B 中具有多个匹配行,反之亦然。 通过定义第三个表(称为连接表)来创建这种关系。 连接表的主键由表 A 和表 B 中的外键组成。例如,"Authors"表和"Titles"表具有多对多关系,该关系由从每个表到"TitleAuthors"表的一对多关系定义。 "TitleAuthors"表的主键是 au_ID 列 ("Authors"表的主键) 和 title_ID 列 ("Titles"表的主键 )的组合。

Access 关系窗口中多对多关系示例的屏幕截图。

一对一关系

在一对一关系中,表 A 中的行在表 B 中只能有一个匹配行,反之亦然。 如果两个相关列都是主键或具有唯一的约束,则创建一对一关系。

这种关系并不常见,因为以这种方式关联的大多数信息都在一个表中。 可以使用一对一关系执行以下操作:

  • 将一个表分成许多列。
  • 出于安全考虑,隔离表的一部分。
  • 存储短期的且可以通过删除表来删除的数据。
  • 存储仅适用于主表子集的信息。

在 Access 中,一对一关系的主键端用键符号表示。 外键端也用键符号表示。

如何定义表之间的关系

在表之间创建关系时,相关字段不必具有相同的名称。 但是,除非主键字段是自动编号字段,否则相关字段必须具有相同的数据类型。 只有当两个匹配字段的 FieldSizeproperty 相同时,才能将"自动编号"字段与"数字"字段匹配。 例如,如果两个字段的 FieldSizeproperty 为长整型,则您可以匹配“自动编号”字段和“数字”字段。 即使两个匹配字段都是“数字”字段,它们也必须具有相同的 FieldSizeproperty 设置。

如何定义一对多或一对一关系

若要创建一对多或一对一关系,请按照以下步骤操作:

  1. 关闭所有表。 不能在打开的表之间创建或更改关系。

  2. 在 Access 2002 或 Access 2003 中,请按照以下步骤操作:

    1. 按 F11 切换到“数据库”窗口。
    2. 在“工具”菜单上,单击“关系

    在 Access 2007、Access 2010 或 Access 2013 中,单击“数据库工具”选项卡上的“显示/隐藏”组中的“关系”

  3. 如果尚未在数据库中定义任何关系,则会自动显示"显示表”对话框。 如果要添加想要相关的表,但不显示“显示表”对话框,请单击“关系”菜单上的“显示表”

  4. 双击要关联表的名称,然后关闭"显示表"对话框。 若要在表和其自身之间创建关系,请添加该表两次。

  5. 将要关联的字段从一个表拖动到另一个表中的相关字段。 若要拖动多个字段,请按 Ctrl,单击每个字段,然后拖动它们。

    在大多数情况下,将主键字段(此字段以粗体文本显示)从一个表拖动到另一个表中称为外键的类似字段(此字段通常具有相同的名称)。

  6. 此时会出现“编辑关系”对话框。 确保两列中显示的字段名称正确无误。 如有必要,可以更改名称。

    如有必要,设置关系选项。 如果必须在“编辑关系”对话框中提供有关特定项目的信息,请单击问号按钮,然后单击该项目。 (将在本文的稍后部分详细介绍这些选项)

  7. 单击“创建”以创建关系。

  8. 对要关联的每对表重复步骤 4 到步骤 7。

    关闭“编辑关系”对话框时,Access 会询问您是否要保存布局。 无论是保存布局还是不保存布局,您创建的关系都保存在数据库中。

    注意

    您不仅可以在表中创建关系,还可以在查询中创建关系。 但是,查询不强制执行引用完整性。

如何定义多对多关系

要创建多对多关系,请按照下列步骤操作:

  1. 创建两个包含多对多关系的表。

  2. 创建第三个表。 这是连接表。 在连接表中,添加与步骤 1 中创建的每个表中主键字段定义相同的新字段。 在连接表中,主键字段用作外键。 你可以将其他字段添加到连接表中,就像添加到任何其他表一样。

  3. 在连接表中,设置主键以包含其他两个表中的主键字段。 例如,在 "TitleAuthors" 连接表中,主键可能由 OrderIDProductID 字段组成。

    注意

    要创建主键,请按照以下步骤操作:

    1. 在“设计”视图中打开一个表。

    2. 选择要定义为主键的一个或多个字段。 要选择一个字段,请单击所需字段的行选择器。 要选择多个字段,请按住 Ctrl 键,然后单击每个字段的行选择器。

    3. 在 Access 2002 或 Access 2003 中,单击工具栏上的“主键”

      在 Access 2007 中,单击“设计”选项卡上“工具”组中的“主键”

      注意

      如果希望多字段主键中字段的顺序与表中这些字段的顺序不同,请单击工具栏上的“索引”以显示“索引”对话框,然后对名为 PrimaryKey 的索引的字段名称重新排序。

  4. 定义每个主表和连接表之间的一对多关系。

引用完整性

参照完整性是一个规则体系,Access 用它来确保相关表中记录之间的关系有效,并且不会意外删除或更改相关数据。 当满足以下所有条件时,即可设置参照完整性:

  • 主表中的匹配字段是主键或具有唯一索引。
  • 相关字段具有相同的数据类型。 有两个例外情况。 “AutoNumber”字段可以关联到 FieldSize 属性设置为“长整型”的“Number”字段,而 FieldSize 属性设置为“复制 ID”的“AutoNumber”字段可以关联到 FieldSize 属性设置为“复制 ID”的“Number”字段。
  • 这两个表都属于同一 Access 数据库。 如果表是链接表,则必须为 Access 格式,并且必须打开存储这些表的数据库以设置参照完整性。 无法对来自其他格式数据库中的链接表实施参照完整性。

使用参照完整性时,以下规则适用:

  • 不能在相关表的外键字段中输入主表的主键中不存在的值。 但是,可以在外键中输入 Null 值。 这指定记录之间不相关。 例如,不能获取分配给不存在的客户的订单。 但是,可以在“CustomerID”字段中输入 Null 值来获取未分配的订单。
  • 如果相关表中存在匹配记录,则不能从主表中删除记录。 例如,如果“订单”表中有分配给雇员的订单,则不能从“雇员”表中删除该雇员记录。
  • 如果该记录具有相关记录,则不能更改主表中的主键值。 例如,如果“订单”表中有分配给雇员的订单,则不能更改“雇员”表中该雇员的 ID。

级联更新和删除

对于实施参照完整性的关系,可以指定是希望 Access 自动级联更新还是级联删除相关记录。 如果设置这些选项,将启用通常由参照完整性规则阻止的删除和更新操作。 在主表中删除记录或更改主键值时,Access 会对相关表进行必要的更改以保持参照完整性。

如果在定义关系时单击以选中“级联更新相关字段”复选框,则只要更改主表中记录的主键,Microsoft Access 就会自动将所有相关记录中的主键更新为新值。 例如,如果更改“客户”表中客户的 ID,则“订单”表中的 CustomerID 字段将针对该客户的每一个订单自动更新,以便关系不会中断。 Access 级联更新时不显示任何消息。

注意

如果主表中的主键是自动编号字段,则选中“级联更新相关字段”复选框将不起作用,因为无法更改“自动编号”字段中的值。

如果在定义关系时选中“级联删除相关记录”复选框,则只要删除主表中的记录,Access 就会自动删除相关表中的相关记录。 例如,如果从“客户”表中删除客户记录,则所有客户订单都会从“订单”表中自动删除。 (这包括“订单明细”表中与“订单”记录相关的记录)。 当选中“级联删除相关记录”复选框并从窗体或数据表中删除记录时,Access 会警告你相关记录可能也会被删除。 但是,在使用删除查询删除记录时,Access 会自动删除相关表中的记录,而不会显示警告。

联接类型

有三种联接类型。 以下屏幕截图显示了它们。

“联接属性”的屏幕截图,其中显示了三种联接类型。

选项 1 定义内联。 内联是在联接字段中的值满足指定条件时,两个表中的记录组合在查询结果中的联接。 在查询中,默认联接是一个内联,仅在联接字段中的值匹配时选择记录。

选项 2 定义左外联。 左外联是一个联接,其中查询的 SQL 语句中 LEFT JOIN 操作左侧的所有记录都添加到查询的结果中,即使右侧表中的联接字段中没有匹配值。

选项 3 定义右外联。 右外联是一个联接,其中查询的 SQL 语句中 RIGHT JOIN 操作右侧的所有记录都添加到查询的结果中,即使左侧表中的联接字段中没有匹配值。