在 Microsoft Access 数据库中定义表之间的关系

文章翻译 文章翻译
文章编号: 304466 - 查看本文应用于的产品
初级用户:要求具备单用户计算机的用户界面知识。

本文仅适用于 Microsoft Access 数据库(.mdb 或 .accdb)。
有关本文的 Microsoft Access 2000 版本,请参见 304467
有关本文的 Microsoft Access 97 版本,请参见 304468
展开全部 | 关闭全部

本文内容

概要

本文介绍如何在 Microsoft Access 数据库中定义关系。包括以下主题:
  • 什么是表关系
  • 表关系的类型
    • 一对多关系
    • 多对多关系
    • 一对一关系

  • 如何定义表之间的关系
    • 如何定义一对多或一对一关系
    • 如何定义多对多关系

  • 引用完整性
  • 级联更新和删除
  • 联接类型

更多信息

什么是表关系

在关系数据库中,通过关系您可以防止出现重复数据。例如,如果您在设计一个跟踪书籍相关信息的数据库,您可能有一个名为“书籍”的表,该表存储每种书籍的相关信息,例如书名、出版日期和出版商。您可能还想存储有关出版商的信息,例如出版商的电话号码、地址及邮政编码。如果将所有这些信息都存储在“书籍”表中,对于出版商出版的每种书籍,该出版商的电话号码将是重复的。

更好的解决方案是,只需将出版商信息在单独的表“出版商”中存储一次。然后在“书籍”表中放置一个指针,该指针引用“出版商”表中的一项。

为了确保数据保持同步,可以在“书籍”和“出版商”表之间强制执行引用完整性。引用完整性关系有助于确保一个表中的信息与另一个表中的信息相匹配。例如,“书籍”表中的每种书籍必须与“出版商”表内的某个特定出版商关联。对于数据库中不存在的出版商,无法向数据库中添加相应书籍。

表关系的类型

关系是通过匹配键列(通常是两个表中的同名列)中的数据来工作。大多数情况下,关系将一个表中的主键(为每一行提供唯一标识符)与另一个表内外键中的项匹配。例如,通过在“书籍”表中的 title_id 列(主键)和“销售额”表中的 title_id 列(外键)之间创建关系,可以将销售额与所售的特定书籍相关联。

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

一对多关系

一对多关系是最常见的关系类型。在此类型的关系中,表 A 中的一行在表 B 中可以有多个匹配行,但表 B 中的一行在表 A 中只能有一个匹配行。例如,“出版商”表和“书籍”表具有一对多关系:每家出版商可以出版多种书籍,而每种书籍只能来自一家出版商。

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

在 Access 中,一对多关系的主键侧由键符号表示。关系的外键侧由无穷符号表示。

多对多关系

在多对多关系中,表 A 中的一行在表 B 中可以有多个匹配行,反之亦然。通过定义称为联接表的第三个表可以创建这种关系,联接表的主键由表 A 和表 B 中的外键组成。例如,“作者”表和“书籍”表具有多对多关系,该关系由这两个表与“书籍作者”表之间的一对多关系定义。“书籍作者”表的主键是 au_id 列(“作者”表的主键)和 title_id 列(“书籍”表的主键)的组合。

一对一关系

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

此类型的关系不常见,因为多数通过此方法相关的信息都会在一个表内。可以使用一对一关系执行下列操作:
  • 将表分为多列。
  • 出于安全考虑将表的一部分隔离。
  • 存储短期的且仅通过删除表即可轻易删除的数据。
  • 存储仅应用于主表子集的信息。
在 Access 中,一对一关系的主键侧由键符号表示。外键侧也由键符号表示。

如何定义表之间的关系

在表之间创建关系时,相关字段不一定必须具有相同名称。但是,相关字段必须具有相同的数据类型,除非主键字段是自动编号字段。仅当两个匹配字段的 FieldSize 属性相同时,才可以将自动编号字段与数字字段匹配。例如,如果自动编号字段和数字字段的 FieldSize 属性是长整型,您就可以将这两个字段匹配。即使当两个匹配字段都是数字字段时,它们仍必须具有相同的 FieldSize 属性设置。

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

要创建一对多或一对一关系,请按照下列步骤操作:
  1. 关闭已打开的所有表。无法创建或修改打开的表之间的关系。
  2. 在 Access 2002 或 Access 2003 中,按照下列步骤操作:
    1. 按 F11 切换到“数据库”窗口。
    2. 在“工具”菜单上,单击“关系”。
    在 Access 2007 中,单击“数据库工具”选项卡上的“显示/隐藏”组中的“关系”。
  3. 如果尚未在数据库中定义任何关系,则“显示表”对话框自动显示。如果要添加想要相关的表,但“显示表”对话框未显示,请单击“关系”菜单上的“显示表”。
  4. 双击想要相关的表的名称,然后关闭“显示表”对话框。要在表与其自身之间创建关系,请将该表添加两次。
  5. 将想要相关的字段从一个表中拖至另一个表中的相关字段。要拖动多个字段,请按住 Ctrl 并单击每个字段,然后拖动它们。

    大多数情况下,您将主键字段(以粗体文本显示)从一个表中拖至另一个表中称为外键的类似字段(通常具有相同名称)。
  6. “编辑关系”对话框将出现。确保显示在两列中的字段名称是正确的。必要时可以更改它们。

    如果需要,可以设置关系选项。如果需要有关“编辑关系”对话框中的某个特定项的信息,请单击问号按钮,然后单击该项。这些选项将在本文的后面部分详细介绍。
  7. 单击“创建”创建关系。
  8. 对想要相关的每一对表重复步骤 5 到步骤 8。

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

    注意:可以在查询以及表中创建关系。然而,引用完整性对查询不是强制执行的。

如何定义多对多关系

要创建多对多关系,请按照下列步骤操作:
  1. 创建两个将具有多对多关系的表。
  2. 创建称为联接表的第三个表,然后向联接表中添加与其他两个表中的每个表内的主键字段具有相同定义的新字段。在联接表内,主键字段作为外键。与其他任何表一样,您可以向联接表中添加其他字段。
  3. 在联接表中,设置主键以包括其他两个表中的主键字段。例如,在联接表“书籍作者”中,主键将由“订单 ID”和“产品 ID”字段组成。

    注意:要创建一个主键,请按照下列步骤操作:
    1. 在“设计”视图中打开一个表。
    2. 选择要定义为主键的一个或多个字段。要选择一个字段,请单击所需字段的行选择器。

      要选择多个字段,请按住 Ctrl 键,然后单击每个字段的行选择器。
    3. 在 Access 2002 或 Access 2003 中,单击工具栏上的“主键”。

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

      注意:如果希望多字段主键中字段的顺序与表中这些字段的顺序不同,请单击工具栏上的“索引”以显示“索引”对话框,然后对名为 PrimaryKey 的索引的字段名称重新排序。
  4. 在两个主表中的每一个主表与联接表之间定义一个一对多关系。

引用完整性

引用完整性是一套规则,Microsoft Access 使用它确保相关表中的记录之间的关系有效,并保证您不会无意间删除或更改相关的数据。当符合下列所有条件时,您可以设置引用完整性:
  • 主表中的匹配字段是主键或者具有唯一索引。
  • 相关字段具有相同数据类型。但有两种例外情况。自动编号字段可以和 FieldSize 属性设置为长整型的数字字段相关,并且 FieldSize 属性设置为 Replication ID 的自动编号字段可以和 FieldSize 属性设置为 Replication ID 的数字字段相关。
  • 两个表属于同一 Microsoft Access 数据库。如果表是链接表,则它们必须为 Microsoft Access 格式,并且您必须打开存储表的数据库以便设置引用完整性。无法为其他格式的数据库中的链接表强制执行引用完整性。
当您使用引用完整性时,以下规则适用:

  • 不可以在主表的主键中不存在的相关表外键字段中输入值。不过,您可以在外键中输入一个 Null 值以指定这些记录不相关。例如,不能有一个分配给不存在客户的订单,但是通过在“客户 ID”字段中输入一个 Null 值可以有未分配给任何人的订单。
  • 如果一个记录在相关的表中存在匹配的记录,则不能够从主表中删除该记录。例如,如果在“订单”表中有分配给某个员工的订单,则您不能够从“员工”表中删除该员工记录。
  • 如果一个记录有相关的记录,则您不能在主表中更改其主键值。例如,如果在“订单”表中有分配给某一员工的订单,则您不能够在“员工”表中更改此员工的 ID。

级联更新和删除

对于强制执行了引用完整性的关系,您可以指定是否希望 Microsoft Access 自动级联更新或级联删除相关的记录。如果设置了这些选项,则通常由引用完整性规则阻止的删除和更新操作将能够进行。当您在主表中删除记录或更改主键值时,Microsoft Access 将对相关表进行必要的更改以保持引用完整性。

如果您在定义关系时单击选中了“级联更新相关字段”复选框,则每当您更改主表中记录的主键时,Microsoft Access 就会自动将所有相关记录中的主键值更新为新值。例如,如果您更改“客户”表中的客户 ID,则“订单”表中该客户的每一个订单的“客户 ID”字段都会自动更新,这样就不会破坏关系。Microsoft Access 执行级联更新时不显示任何消息。

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

如果您在定义关系时选中了“级联删除相关记录”复选框,则每当您删除主表中的记录时,Microsoft Access 就会自动删除相关表中的相关记录。例如,如果您从“客户”表中删除一个客户记录,则该客户的所有订单会自动从“订单”表(包括与“订单”记录相关的“订单明细”表中的记录)中删除。当您在选中“级联删除相关记录”复选框的情况下从窗体或数据表中删除记录时,Microsoft Access 会警告您相关记录也可能会被删除。然而,当您使用删除查询删除记录时,Microsoft Access 将自动删除相关表中的记录而不显示警告。

联接类型

有三种联接类型,如下所示:

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

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

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

属性

文章编号: 304466 - 最后修改: 2013年7月16日 - 修订: 5.3
这篇文章中的信息适用于:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 标准版
关键字:?
kbdesign kbdatabase kbhowto KB304466
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com