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

注释

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

概要

本文介绍如何在 Microsoft Access 数据库中定义关系。 该文章的内容包括:

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

什么是表关系?

在关系数据库中,关系使你能够防止冗余数据。 例如,如果要设计跟踪书籍信息的数据库,则可能有一个名为“Titles”的表,用于存储有关每本书的信息,例如书籍的标题、出版物日期和出版商。 你可能还希望存储有关发布者的信息,例如发布者的电话号码、地址和邮政编码。 如果将所有这些信息存储在“标题”表中,出版社的电话号码将在出版社打印的每个标题中重复。

更好的解决方案是只将发布者的信息一次存储在名为“Publishers”的单独表中。然后将指针放在引用“Publishers”表中的条目的“Titles”表中。

若要确保数据保持同步,可以在表之间强制实施引用完整性。 引用完整性关系有助于确保一个表中的信息与另一个表中的信息匹配。 例如,“Titles”表中的每个标题都必须与“Publishers”表中的特定发布者相关联。 无法将游戏添加到数据库中不存在的发布者的数据库中。

数据库中的逻辑关系使你能够有效地查询数据和创建报表。

表关系类型

要使关系有效,通常通过对两个表中具有相同名称的关键列或字段中的数据进行匹配。 在大多数情况下,关系将主键或每一行的唯一标识符列从一个表连接到另一个表中的字段。 另一个表中的列称为“外键”。例如,如果要跟踪每个书名的销售情况,请在“Titles”表中的主键列(我们称之为title_ID)与“Sales”表中名为title_ID的列之间创建关系。 “Sales”表中的title_ID列是外键。

表之间存在三种关系。 创建的关系类型取决于如何定义相关列。

一对多关系

一对多关系是最常见的关系类型。 在这种关系中,表 A 中的行可以在表 B 中具有许多匹配行。但表 B 中的行在表 A 中只能有一个匹配的行。例如,“Publishers”和“Titles”表具有一对多关系。 也就是说,每个出版商都会产生许多作品。 但每个游戏只来自一个发布者。

当只有一个相关列是主键或具有唯一约束时,会创建一个一对多关系。

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

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

多对多关系

在多对多关系中,表 A 中的行可以在表 B 中具有许多匹配的行,反之亦然。 通过定义名为交接表的第三个表来创建此类关系。 连接表的主键由表 A 和表 B 中的外键组成。例如,“作者”表和“书名”表之间存在多对多关系,这种关系通过从这两个表到“书名作者”表的一对多关系来定义。 “TitleAuthors”表的主键是 au_ID 列(“作者”表的主键)和 title_ID 列(“Titles”表的主键)的组合。

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

一对一关系

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

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

  • 将包含多个列的表除以。
  • 出于安全原因,将某一部分从表中隔离开来。
  • 存储生命周期较短且通过删除表可以轻易删除的数据。
  • 存储仅适用于主表子集的信息。

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

如何定义表之间的关系

在表之间创建关系时,相关字段不必具有相同的名称。 但是,除非主键字段是“自动编号”字段,否则相关字段必须具有相同的数据类型。 仅当两个匹配字段的FieldSizeproperty 相同时,才能将 AutoNumber 字段与 Number 字段匹配。 例如,如果两个字段的FieldSizeproperty 为Long Integer,则可以匹配 AutoNumber 字段和 Number 字段。 即使两个匹配字段都是 Number 字段,它们也必须具有相同的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 用来确保相关表中记录之间的关系有效的规则系统,并且不会意外删除或更改相关数据。 如果满足以下所有条件,则可以设置引用完整性:

  • 主表中的匹配字段是主键或具有唯一索引。
  • 相关字段具有相同的数据类型。 有两个例外。 “自动编号”字段可以与具有FieldSize长整数属性设置的 Number 字段相关,并且具有复制 ID 属性设置的“自动编号”字段FieldSize可以与具有FieldSize复制 ID 属性设置的数字字段相关。
  • 这两个表都属于同一 Access 数据库。 如果表是链接表,则必须是 Access 格式的表,并且您必须打开存储这些表的数据库,以设置引用完整性。 不能对其他格式的数据库中的链接表强制实施引用完整性。

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

  • 不能在主表的主键中不存在的相关表的外键字段中输入值。 但是,可以在外键中输入 Null 值。 这表明这些记录是无关的。 例如,不能向不存在的客户分配订单。 但是,可以通过在 CustomerID 字段中输入 Null 值,使订单不分配给任何人。
  • 如果相关表中存在匹配的记录,则无法从主表中删除记录。 例如,如果向“订单”表中的员工分配了订单,则无法从“员工”表中删除员工记录。
  • 如果该记录具有相关记录,则不能更改主表中的主键值。 例如,如果“订单”表中有分配给该雇员的订单,则无法在“员工”表中更改员工的 ID。

级联更新与删除

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

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

注释

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

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

联接类型

有三种联接类型。 可以在以下屏幕截图中看到它们:

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

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

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

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