4.6 建立表之间的关系
良好的数据库设计目标之一就是消除数据冗余(即重复数据)。要实现这一目标,可将数据拆分为多个基于主题的表,尽量使每条记录只出现一次,然后在相关表中放置公共字段,并建立各表之间的关系,从而将拆分的数据组合到一起,这也是关系型数据库的运行原理。由此可知,表关系是数据库中非常重要的一部分。
在Access 2016中共有三种类型的表关系,分别是一对一关系、一对多关系和多对多关系。本节将分别介绍这三种类型。
4.6.1 一对一表关系
在一对一关系中,第一个表中的每条记录在第二个表中只有一个匹配记录,而第二个表中的每条记录在第一个表中也只有一个匹配记录。这两个表通常是基于同一个主题。
在实际应用中,这种关系并不常见,因为多数与此方式相关的信息都存储在一个表中。事实上,一对一关系通常应该避免,因为这违反了规范化的规则。但在某些特殊情况下还是需要使用一对一表关系。
☆ 出于安全原因,隔离表中部分数据,仅限于特殊权限的用户查看。
☆ 将常用和不常用字段放置于两个表中,以提高常用字段的检索和查询效率。
在创建一对一关系时,两个表必须共享一个公共字段,并且该公共字段必须具有唯一索引。创建一对一关系的具体操作步骤如下。
步骤1打开随书光盘中的“素材\Ch04\客户管理.accdb”文件,进入“客户信息表”的设计视图,单击【表格工具】→【设计】选项卡下【关系】组中的【关系】按钮,如图4-60所示。
图4-60 单击【关系】按钮
步骤2弹出【显示表】对话框,在【表】选项卡下显示了当前数据库中所有的表对象。在其中选择“客户信息表”和“原始信息表”,单击【添加】按钮,如图4-61所示。
图4-61 【显示表】对话框
步骤3此时将打开“关系”窗口,并且其中已添加了相应的表对象。在【显示表】对话框中单击【关闭】按钮,关闭对话框,然后在“关系”窗口中,将“客户信息表”中的“客户ID”字段拖动至“原始信息表”中的“客户ID”字段上,如图4-62所示。
图4-62 “关系”窗口
提示
在左侧窗格中将表对象拖动到“关系”窗口中,也可添加该表对象到“关系”窗口中。
步骤4 弹出【编辑关系】对话框,保持默认设置不变,如图4-63所示,单击【创建】按钮。
图4-63 【编辑关系】对话框
步骤5此时已创建一对一表关系,两个表中的“客户ID”字段使用关系连接线连接起来,如图4-64所示。
图4-64 创建一对一表关系
步骤6单击快速访问工具栏中的【保存】按钮,保存创建的表关系。将“客户信息表”切换至数据表视图,可以发现每条记录的行首出现了图标。单击该图标,Access以子表的形式显示出“原始信息表”中该客户的数据,如图4-65所示。
图4-65 创建关系后的效果
提示
若打开“原始信息表”的数据表视图,在其中可以发现,Access同样会以子表的形式显示出“客户信息表”中该客户的数据。
4.6.2 一对多表关系
一对多表关系在数据库中最为常见。在关系“一方”的字段必须具有唯一索引,该字段通常为主键,该表被称为主表。关系“多方”的字段不应具有唯一索引,它可以有索引,但必须允许重复,该字段通常被称为表关系的“外键”。
要在数据库中表示一对多关系,需要设置表关系“一方”的主键,并将其作为额外公共字段添加到关系“多方”的表中。假设在客户管理数据库中,有“客户信息表”和“订单表”,一个客户可以有多个订单,而一个订单只能对应一个客户。因此,在一对多的表关系中,关系“一方”应为“客户信息表”,而关系“多方”应为“订单表”,这里就需要将“客户信息表”中的“客户ID”字段(主键)添加到“订单表”中。
创建一对多表关系的具体操作步骤如下。
步骤1接上一节的操作,切换到“关系”窗口,单击【关系工具】→【设计】选项卡下【关系】组中的【显示表】按钮,如图4-66所示。
图4-66 单击【显示表】按钮
步骤2弹出【显示表】对话框,在【表】选项卡下选择“订单表”,如图4-67所示,单击【添加】按钮。
图4-67 【显示表】对话框
步骤3将“订单表”添加到“关系”窗口中,在【显示表】对话框中单击【关闭】按钮,关闭对话框,然后在“关系”窗口中将“客户信息表”中的“客户ID”字段拖动至“订单表”中的“客户ID”字段上,如图4-68所示。
图4-68 “关系”窗口
步骤4弹出【编辑关系】对话框,保持默认设置不变,如图4-69所示,单击【创建】按钮。
图4-69 【编辑关系】对话框
步骤5此时已创建一对多表关系,两个表中的“客户ID”字段使用关系连接线连接起来,如图4-70所示。
图4-70 创建一对多表关系
步骤6单击快速访问工具栏中的【保存】按钮,保存创建的表关系。重新打开“客户信息表”的数据表视图,单击某条记录行首的图标,在下方将以子表的形式显示出该客户的所有订单信息,如图4-71所示。
图4-71 创建关系后的效果
提示
在一对多的表关系中,只有关系“一方”的数据表才能查看子表的信息。关系“多方”的数据表是无法出现子表的。
4.6.3 多对多表关系
要表示多对多关系,用户需要创建第三个表,该表通常被称为联接表。它将多对多关系划分为两个一对多关系,并将这两个表的主键都插入第三个表中,或者将第三个表的主键插入这两个表中,通过第三个表的连接建立起多对多的关系。注意,第三个表既可作为一对多关系中的“一方”,也可作为“多方”。
例如,在客户管理数据库中包含“订单纳税状态表”,一个订单纳税状态可以出现在多张订单中,它与“订单表”是一对多表关系,而“客户信息表”与“订单表”也是一对多表关系。因此可以说,“订单纳税状态表”和“客户信息表”是多对多表关系,而“订单表”即是第三个表(联接表),它作为一对多关系中的“多方”连接这两个表。创建表关系时,用户需要将这两个表的主键字段插入“订单表”中,如图4-72所示。
图4-72 “订单纳税状态表”和“客户信息表”是多对多表关系
假设在客户管理数据库中还包含“客户访问表”,一个客户可以多次访问公司,“客户信息表”与“客户访问表”是一对多表关系。因此可以说,“订单表”和“客户访问表”是多对多表关系,而“客户信息表”即是第三个表,它作为一对多关系中的“一方”连接这两个表。创建表关系时,用户需要将“客户信息表”的主键字段插入这两个表,如图4-73所示。
图4-73 “订单表”和“客户访问表”是多对多表关系
创建多对多表关系的具体操作步骤如下。
步骤1接上一节的操作,切换到“关系”窗口,单击【关系工具】→【设计】选项卡下【关系】组中的【显示表】按钮,如图4-74所示。
图4-74 单击【显示表】按钮
步骤2在弹出的【显示表】对话框中选择“客户访问表”,单击【添加】按钮,然后关闭对话框,即可将“客户访问表”添加到“关系”窗口中,如图4-75所示。将“客户访问表”中的“客户ID”字段拖动至“客户信息表”中的“客户ID”字段上。
图4-75 添加“客户访问表”
步骤3弹出【编辑关系】对话框,保持默认设置不变,单击【创建】按钮,如图4-76所示。
图4-76 【编辑关系】对话框
步骤4完成创建“客户信息表”和“客户访问表”的一对多表关系,此时“客户访问表”和“订单表”即为多对多表关系,如图4-77所示。
图4-77 “客户访问表”和“订单表”为多对多表关系
提示
用户也可以直接将“客户访问表”的“客户ID”字段拖动到“订单表”的“客户ID”字段上,从而创建两个表之间的多对多关系。但在实际应用中,通常是用两个一对多关系来表示多对多关系,而非直接创建。
4.6.4 查看与编辑表关系
表关系创建完成后,用户可以根据需要对表关系进行查看、编辑或隐藏等操作。
1.查看表关系
查看表关系的具体操作步骤如下。
步骤1在要查看表关系的数据库中单击【数据库工具】选项卡下【关系】组中的【关系】按钮,如图4-78所示。
图4-78 单击【关系】按钮
步骤2打开“关系”窗口,在其中可查看当前数据库中所有的表关系,如图4-79所示。
图4-79 “关系”窗口
2.编辑表关系
打开“关系”窗口后,功能区中会增加【关系工具】→【设计】选项卡,利用该选项卡中的各命令按钮可编辑表关系,如图4-80所示。
图4-80 【关系工具】→【设计】选项卡
各按钮的作用如下。
☆ 【编辑关系】:在“关系”窗口中单击要编辑的关系连接线,此时该关系连接线显示得较粗,表示为选中状态,如图4-81所示;然后单击该按钮,弹出【编辑关系】对话框,在其中可以设置实施参照完整性、设置联接类型和新建表关系等,如图4-82所示。
图4-81 单击选中关系连接线
图4-82 【编辑关系】对话框
提示
双击关系连接线,或者在关系连接线上单击鼠标右键,在弹出的快捷菜单中选择【编辑关系】菜单命令,同样可打开【编辑关系】对话框。
☆ 【清除布局】:单击该按钮,可隐藏“关系”窗口中所有的表对象及关系连接线,效果如图4-83所示。
图4-83 清除布局
☆ 【关系报告】:单击该按钮,Access将自动生成表关系的报表,并进入打印预览模式,用户可打印该报表,效果如图4-84所示。
图4-84 生成表关系的报表
☆ 【显示表】:单击该按钮,将弹出【显示表】对话框,在其中可添加表对象到“关系”窗口中。
☆ 【隐藏表】:在“关系”窗口中选择表对象后,单击该按钮,可隐藏所选的表对象。
☆ 【直接关系】:在“关系”窗口中选择表对象后,单击该按钮,可显示出与该表有直接关系的所有表。
☆ 【所有关系】:单击该按钮,将显示出当前所有的表关系。
☆ 【关闭】:单击该按钮,可退出“关系”窗口。
4.6.5 实施参照完整性
Access允许数据库实施参照完整性规则,从而保护数据不会丢失或遭到破坏。例如,“客户信息表”和“订单表”之间存在一对多关系,假设要在“客户信息表”中删除一条客户信息,而该客户在“订单表”中具有订单,那么删除该客户信息后,这些订单将成为“孤立记录”。即,这些订单仍然包含客户ID,但该客户ID不再有效,因为它所参照的客户信息不再存在。由此而知,使用参照完整性规则的目的就是防止出现孤立记录并保持参照同步。
实施参照完整性的具体操作步骤如下。
步骤1接上一节的操作,打开“关系”窗口,双击“客户信息表”和“订单表”的关系连接线,如图4-85所示。
图4-85 双击关系连接线
步骤2弹出【编辑关系】对话框,在其中选中【实施参照完整性】复选框,如图4-86所示,单击【确定】按钮。
图4-86 【编辑关系】对话框
步骤3为所选表实施参照完整性,此时关系连接线上分别以和符号标记出一对多的表关系,如图4-87所示。
图4-87 实施参照完整性的效果
注意,在实施参照完整性之后,Access将拒绝违反表关系参照完整性的任何操作,并会严格限制主表和中间表的记录修改和更新操作。限制规则如下。
☆ 如果在主表的主键字段中不存在某条记录,则不能在相关表的外键字段中输入该记录,否则会创建孤立记录,即不允许在“多端”的字段中输入“一端”主键中不存在的值。
☆ 当“多端”的表中含有和主表相匹配的记录时,不可从主表中删除这条记录。例如,如果在“订单表”中有某客户的订单,则不能从“客户信息表”中删除该客户的记录。但是如果在【编辑关系】对话框中选中了【级联删除相关记录】复选框,则用户在进行删除操作时可以删除“客户信息表”中某个客户的记录,系统会同时删除“订单表”中该客户所有的订单记录,从而保证数据的完整性。
☆ 当“多端”的表中含有和主表相匹配的记录时,不可从主表中改变相应的主键的值。例如,如果在“订单表”中有某客户的订单,则不能从“客户信息表”中改变该客户的客户ID值。但是如果在【编辑关系】对话框中选中了【级联更新相关字段】复选框,则允许完成此操作。
4.6.6 设置级联选项
用户有时可能需要更新或删除关系一方的值,那么关系另外一方的值会发生什么变化呢?对于数据库完整性而言,用户希望当关系一方的值更新或删除时,系统能自动更新或删除所有受影响的值,这样数据库可以进行完整更新,有效地防止了整个数据库呈现不一致的状态。
Access提供的【级联更新相关字段】和【级联删除相关记录】两个选项可以解决该问题,如图4-88所示。如果实施了参照完整性并选中【级联更新相关字段】复选框,当更新主键时,Access将自动更新参照主键的所有字段。同样地,如果选中【级联删除相关记录】复选框,当删除包含主键的记录时,Access会自动删除参照该主键的所有记录。
图4-88 设置级联选项
提示
如果主键是“自动编号”字段,那么设置【级联更新相关字段】复选框将不起作用,因为系统无法更改“自动编号”字段中的值。此外,只有实施了参照完整性,才能设置相关级联选项。
4.6.7 删除表关系
若要删除表关系,只需在“关系”窗口中删除关系连接线即可。下面介绍两种删除表关系的方法。
提示
删除表关系时,如果表关系中涉及的任何一个表处于打开状态,或正在被其他程序使用,则无法删除该表关系。
⑴ 在“关系”窗口中选择要删除的关系连接线(选中状态时显示得较粗),按Delete键,弹出Microsoft Access对话框,单击【是】按钮,即可删除表关系,如图4-89所示。
图4-89 Microsoft Access对话框
⑵ 在关系连接线上单击鼠标右键,在弹出的快捷菜单中选择【删除】菜单命令,如图4-90所示。
图4-90 选择【删除】菜单命令