在向Personnel Actions表添加记录之前的最后一项任务便是确定Personnel Actions和数据库 中现有表之间的关系,指定主键字段,然后向该表添加索引。 第4章 使用Access数据库和表 97 下载4.10.1 建立表之间的关系 现有的表和新表之间的关系决定了使用哪个字段作为新表的主键。 表和表之间的关系存在以下四种可能: • 一对一关系 需要新表中仅有一个记录的关键字字段的值与现有表中相关字段的某个单 独的值相匹配。 • 多对一关系 允许新表的关键字字段中可以有多个值与现有表中相关字段中某个单独的 值相匹配。 • 一对多关系 需要新表的主键字段唯一,但是新表外部键中的值可以和现有数据库中相 关字段中的多个项相匹配。在这种类型中,现有数据库中有关的字段与新数据库的主键 字段具有多对一关系。 • 多对多关系 一种完全没有限制的关系,不要求现有表或者新表中的关键字字段之间存 在唯一的关系,并且两个表的外部键字段可以包含重复的值。 需要记住的是,多对一关系和一对多关系其实是同一件事情,只是所占的角度不同。当从 现有的表出发来考虑问题时,则和新表便是一对多的关系。第 2 2章更为广泛地解释了关系的四 种类型。 对于关系的这四种类型的清单,参见2 2 . 5 . 2节“关系类型”一节。 Personnel Actions表中许多项可以应用到其记录出现在E m p l o y e e s表中的单个的雇员上。当 一个雇员被雇用时,便会在 Personnel Actions表中创建一个记录,并且为每个季度和年终总结 也创建了一个记录。同样对于奖金或者佣金的任何改变也将被输入,而雇员可能会被解雇。随 着时间的推移,Personnel Actions表中记录的数量可能会比E m p l o y e e s表中记录多出1 0多倍或者 更多。因此,新P e r s o n n e l表中的记录与E m p l o y e e s表将具有多对一的关系。在创建新表时建立 新表和现有表之间的关系将使得A c c e s s当你在查询、窗体和报表中使用该表时自动地重新建立 这种关系。 Access 需要两个具有完全相同数据类型的字段来参与关系。在字段数据类型为“数字”的 情况下,两个字段的“字段大小”属性必须相同。例如,你不能在自动编号类型的字段 (使用 长整数数据类型) 和包含字节、整型、单精度型、双精度型或者货币型数据的字段之间创建关 系。在另一方面,A c c e s s允许你通过具有不同长度的文本字段将两个表联系起来。如果创建这 样一个关系,当你创建查询的时候,可能会导致奇怪的行为,查询是第二部分“最大限度地利 用查询”中的主题。原则上,文本字段之间建立关系时应该使用相同长度的字段。 Access 2000使用图形化的“关系”窗口来显示和创建数据库中表之间的关系。使用 A c c e s s 的 “关系”窗口创建表之间的关系时,请遵循如下步骤: 1) 单击“关闭窗口”按钮,将Personnel Actions表关闭。如果E m p l o y e e s表是打开的,将之 关闭。你不能在打开的表之间创建或者修改关系。 2) 在你建立关系之前,必须激活“数据库”窗口。如果它没有处于活跃状态,单击它,然 后单击“显示数据库窗口”工具栏按钮或者选择“窗口”,“1 Northwind :数据库”。对于你打 开的数据库对象,最多有9个可以以带编号选项的形式显示在“窗口”菜单下 (“数据库”窗口 总是编号为1) 。 3) 单击工具栏上的“关系”按钮或者选择“工具”,“关系”。Northwind Tr a d e r s数据库的 “关系”窗口便会打开 (见图4 - 2 7 )。 4) 单击工具栏上的“显示表”按钮或者选择“关系”,“显示表”。“显示表”对话框将被打 开 (见图4 - 2 8 )。 98 第一部分 Access基础 下载图4-27 “关系”窗口 5) 在“表”列表中双击Personnel Actions项,或者单击该项将之选定,然后单击“添加”按 钮,将Personnel Actions表添加到“关系”窗口。单击“关闭”按钮,关闭“显示表”对话框。 6) Personnel Actions表到E m p l o y e e s表的关系是基于 Personnel Actions表的 p a I D字段和 E m p l o y e e s表的E m p l o y e e I D字段的。单击 E m p l o y e e s表的 E m p l o y e e I D字段 ,保持鼠标的左按 钮不放,将之拖到Personnel Actions表的 p a I D字段。释放鼠标按钮,将字段符号放到 p a I D字段 上。“编辑关系”对话框将打开 (见图4 - 2 9 )。 注意 创建一个新的关系时,拖放操作的顺序是相当重要的。必须从一对多关系中一的一方将字 段拖到多的一方,然后将之放下。这个次序可以保证作为关系中一的一方的主表(或者说基表) 出现在“表/查询”列表中,而多的一方出现在“相关表/查询”列表中。如果你颠倒一下该关系 (创建一个多对一关系),并且实施参照完整性,你将在试图创建该关系过程中的最后一步收到一 个错误消息。 7) 单击“联接类型”按钮,显示“联接属性”对话框,如图 4 - 3 0所示。我们想在 E m p l o y e e s表的 E m p l o y e e I D字段(一的一方)和Personnel Actions表的 p a I D字段(多的一方) 之间建立一对多联接,并且希望能够显示所有雇员记录,即便是一个或者多个记录根本不存在 相应的Personnel Actions记录。为此,选择“联接属性”对话框中的选项 2。单击“确定”,关 闭该对话框,返回“关系”对话框。 8) “关系”对话框提供了“实施参照完整性”复选框,所以你可以指定 Access 执行有效 性测试和接受与E m p l o y e e s表的E m p l o y e e I D字段值相对应的p a I D字段项。这个过程叫做实施(或 第4章 使用Access数据库和表 99 下载 图4-28 用于向“关系”窗口添加表的 “显示表”对话框 图4-29 用“编辑关系”对话框定义表之间的关系者维护) 参照完整性。在下面几节中,我们将讨论参照完整性。这两个表之间的关系需要实施 参照完整性,所以要确保你选择了这个复选框。现在的“关系”对话框看上去如图 4 - 3 1所示。 注意 Access 2000可以自动地维护表的参照完整性,并提供了可以标记的复选框,使得在主表改 变时,对相关的记录执行级联更新和级联删除。下面将讨论级联更新和删除。只有在你选择了 实施参照完整性的时候,Access才会激活级联复选框。 9) 单击“创建”按钮,接受这个新的关系并将它在“关系”窗口中显示出来 (见图4 - 3 2 )。 图4-32 添加了新Personnel Actions关系后的“关系”窗口 10) 单击“关闭窗口”按钮,关闭“关系”窗口,返回“数据库”窗口。当让你确定是否 保存对关系图表布局的更改时,单击“是”。 当你创建查询和设计窗体和要用到 Personnel Actions表中的数据的报表时, A c c e s s将使用 你已经创建的这个关系。A c c e s s不需要相关的表建立起索引。Access 2000中新增的“打印 关系”菜单命令,为你提供了一种十分便利的打印关系的方法。在 Access 97中,“打印关系” 命令以一个加载项的形式提供。 4.10.2 实施参照完整性 自动地实施参照完整性是 A c c e s s的一个重要的功能,其他 P C关系数据库管理器很少有这 个特征。参照完整性防止了创建与主表没有连接的孤立记录。我们举一个孤立记录的例子,当 雇员文件中的记录只从 1编号到9的情况下,却存在一个针对 paID 10的人员操作的记录,这个 记录就是一个孤立记录。在你输入下一个雇用的雇员之前,你根本不知道 1 0号雇员是谁。而这 个为其他雇员准备的孤立记录被错误地链接到新雇员的记录上。 100 第一部分 Access基础 下载 图4-30 为Personnel Actions和Employees 表选择联接类型 图4-31 需要实施参照完整性的一对多关系的 关系对话框的输入1. 理解参照完整性是如何实施的 参照完整性的实施可以阻止你删除或者修改主表中那些有相关记录依赖的记录。如果你终 止了某个雇员,然后试图从 E m p l o y e e s表删除该雇员的记录, A c c e s s将会阻止你这么做。 A c c e s s会显示一个消息框,通知你在删除这个主记录之前,你必须删除与该记录相关的所有记 录。你不能改变E m p l o y e e s表的 E m p l o y e e I D字段的值,因为其字段数据类型为自动编号。但是, 如果使用那些你可以改变其值的数据类型,并且有相关的记录依赖这个 E m p l o y e e I D,A c c e s s也 会显示一条警告消息。 与之相似,如果你试图将 Personnel Actions表中p a I D字段的某个雇员的 ID 值改变为 E m p l o y e e s表的 E m p l o y e e I D字段中不存在的一个值,你也会碰到一个错误消息。因此,实施参 照完整性可以消除对 p a I D字段使用有效性规则属性来实施有效性验证的需要。在实施参照完 整性的情况下,A c c e s s将自动地确保当你保存或者编辑一个记录时,你输入的值有一个相应的 有效E m p l o y e e I D。 2. 级联更新和删除 Access 2000为实施参照完整性的表所设的级联删除和级联更新选项使得维护参照完整性变 得相当容易:只需标记“级联更新相关字段”和“级联删除相关记录”复选框即可。 A c c e s s 2 0 0 0将为你做所有的工作。 注意 自动地实施参照完整性通常是(但不总是)一个很好的数据库设计习惯。有时,你或许并 不希望实现级联删除,例如对O r d e r s和E m p l o y e e s表的E m p l o y e e I D字段。如果你解雇了某个雇员, 然后试图删除该雇员的记录,你可能不小心将O r d e r s表中所依赖的记录也删除掉了。站在市场和 会计的立场上,删除O r d e r s表中的记录可能会导致严重的问题 (但是在实际中你可能不会删除一 个解雇的雇员的记录)。 4.10.3 选择一个主键 你不需要为一个永远都不会用作主表的表指定一个主键字段。主表中包含有能够代表一个 对象的信息,例如一个人或者一张发票,而不仅仅是唯一附加在该对象上的一个记录对象。 Personnel Actions表可以作为一个主表,因为它可以标识一个对象—在这里,等价于一个可 以表示两种操作结果的文件窗体:提议和批准。但是, Personnel Actions在和另一个表的关系 中,可能并不一定会用作主表。 使用关键字字段是阻止在表中出现重复记录的最为简单的方法。如果你想要创建一个一对 一的关系或者同时删除两个或者多个表中的记录时, Access 需要你指定一个主键。第 1 0章对 这个问题进行详细的讨论。 用“关系”窗口设置关系时,要求主表必须有一个主键。 A c c e s s认为一个表没有主键字段 是相当奇怪的一件事情; 因此,当你对表进行了改变之后要返回设计视图时,你可能会看到一 则消息,指出你还没有创建关键字字段。 (Access 2000只会问你一次你是否想为表添加主键字 段。)相关的表可以具有一个主键字段,并且通常情况下也会具有一个主键。主键字段在防止 有时不小心向表中添加重复的记录时是相当有用的。 你可以在多个字段上创建主键。对于 Personnel Actions表,防止重复记录的主键必须包含 两个以上的字段,因为一个以上的雇员人员操作可能会被安排或者批准在同一时间执行。如果 建立起这样一条规则,即要求针对某个雇员的人员操作如果同时安排,不能具有两个以上的类 型,你可以创建一个由p a I D、p a Ty p e和p a S c h e d u l e d D a t e字段组成的主键,A c c e s s将基于该主键 第4章 使用Access数据库和表 101 下载创建索引。下一节和第2 2章将对索引进行更为详细的讨论。 下面我们便为 Personnel Actions表创建一个由多个字段组成的主键,并创建索引,步骤 如下: 1) 从“数据库”窗口打开Personnel Actions表,进入“设计”视图。 2) 单击p a I D字段的选择按钮。 3) 按下C t r l,单击p a Ty p e字段的选择按钮。在多数情况下,当你按下 C t r l并单击一个选择 按钮时,你可以进行多重选择。 4) 按下C t r l,单击p a S c h e d u l e d B y字段的选择按钮。 如果你不小心选择了其他的字段,只要再次单击该字段的选择按钮,便可以使它落选。 5) 单击“主键”工具栏按钮。在每个所选的字段中都出现钥匙符号,指明它们都已经包含 在主键中(见图4 - 3 3 )。 图4-33 为Personnel Actions表设置一个多字段主键 6) 如果想决定主键中每个字段的顺序,可以单击工具栏的“索引”按钮,显示“索引”窗 口,如图4 - 3 3所示。 在A c c e s s中,可以创建包含不同数据类型字段的多字段主键和索引。连接不同的数据类型 构成索引指令或者字符串的能力是由A c c e s s的“变量”数据类型提供的。 关于“变量”数据类型和连接字符串的更多信息,参见 9 . 2 . 1节。 有关“变量”数据类型和对象的使用的详细信息,参见 2 6 . 2 . 6节“V B A中数据类型和数据 库对象”。 现在我们已经为Personnel Actions表创建了一个多字段的主键和相应的索引,因此完全可 以排除添加具有相同主键的重复记录。 4.10.4 往表中添加索引 尽管A c c e s s在主键上创建了索引,但你可能还想在表中其他字段上创建索引。索引可以加 速包含特定数据类型的记录的搜索。例如,你或许希望找到以 p a S c h e d u l e d D a t e为序,发生在某 102 第一部分 Access基础 下载 主键指示符个时间段之内的所有人员操作和所有雇员的季度总结。如果在表中有许多记录,索引可以加速 该搜索过程。使用多个索引的缺点是在更新额外的索引时会减慢数据输入操作的速度。每个 A c c e s s表最多可以创建32 索引,其中有5个可以是多字段类型。每个多字段索引可以包含最多 1 0个字段。 提示 只在需要提高搜索的性能时才添加索引。你添加的每个索引都将减慢新记录的添加速度, 因为在添加一个新记录时需要对每个索引也做一次添加。与此类似,编辑索引字段也会变慢, 因为编辑将更新该记录和相应的索引。当你创建表之间的关系时,A c c e s s会自动地在相关的字段 上创建一个隐藏索引,如果该索引不存在的话。隐藏索引也会计算在每个表最多 3 2个索引的限 制之内。如果在“索引”对话框中出现了一个额外的索引,请参见本章后面“疑难解答”部分 中的“由Access添加的额外索引”。 为了给Personnel Actions表创建一个基于p a E ff e c t i v e D a t e字段的单字段索引和基于p a Ty p e和 p a S c h e d u l e d D a t e字段的多字段索引,可以遵循如下步骤: 1) 单击选择按钮,选择p a E ff e c t i v e D a t e字段。 2) 在“字段属性”对话框中选择“索引”文本框。 3) 单击箭头按钮或者按下F 4,打开“索引”下拉列表。该列表便会出现,如图 4 - 3 4所示。 图4-34 创建基于paEffectiveDate字段的单字段索引 4) 在这里,重复的条目是可以接受的, 所以单击“有 (有重复)”, 关闭该列表。这 种方法只能创建单字段索引。 5) 如果“索引”窗口没有打开,单击 “索引”按钮。已经创建的主键和p a E ff e c t i v e - Date 索引出现在列表框中。输入p a Ty p e / D a t e 作为复合索引的名字,然后在“字段名称” 下拉列表中选择 p a Ty p e;将插入符移到“字 段名称”列中的下一行,选择 p a S c h e d u l e d B y 创建一个基于这两个字段的多字段索引(见图4 - 3 5 )。 第4章 使用Access数据库和表 103 下载 图4-35 创建一个多字段索引6) 单击“数据表视图”按钮,返回“运行”模式。当出现消息框问你是否要保存你的设计 改变时,单击“是”。在状态栏出现的消息表明在你离开设计模式时A c c e s s正在创建新的索引。 你现在在主键表上有了三个索引:自动为主键创建的索引、 p a E ff e c t i v e D a t e上的单键索引、 p a Ty p e和p a S c h e d u l e d D a t e上的多键索引。