1

我检查了所有错误:主键、唯一性和类型。Access 似乎无法链接我数据库中的 2 个字段。有人可以看看吗?

http://www.jpegtown.com/pictures/jf5WKxKRqehz.jpg

谢谢。

4

5 回答 5

8

您的关系图显示您已将 ID 字段设置为所有表中的主键,但您没有将它们用于连接。因此,它们完全没有任何用途。如果您不打算使用“代理键”(即,由数据库生成的无意义的 ID 号,并且对于每条记录都是唯一的,但对于表中的数据绝对没有意义),那么消除它们. 但是,如果您要使用“自然键”(即,由一组真实数据字段构成的主键,这些字段对于每条记录都是唯一的),那么您必须在这些字段上有一个唯一的复合索引。

但是,这两种方法都存在问题:

  1. 代理键:代理 PK 使每条记录都是唯一的。也就是说,您可以有一条 ID 为 1 的 David Fenton 记录和一条 ID 为 2 的 David Fenton 记录。如果是同一个 David Fenton,则您有重复的数据,但据您的数据库所知,它们是唯一的。

  2. 自然键:某些类型的实体与自然键配合得很好。最好的情况是有一个唯一标识记录的字段。一个示例是“员工类型”,其中值可能是“员工、经理等”。在这种情况下,它是使用自然键而不是添加代理键的非常好的候选者。在这种情况下,唯一反对自然键的论点是候选自然键中的数据是否高度易变(即,它经常更改)。虽然每个现代数据库引擎都提供“CASCADE UPDATE”功能(即,如果 PK 字段中的值发生更改,则该字段为外键的所有表都会自动更新),但这会产生一定的开销并且可能会出现问题。对于单列键,这不太可能成为问题。现在,除了查找表,很少有实体的自然键是单列。相反,您必须创建一个复合索引,即跨越多个数据字段的索引。在 Access 表设计的索引对话框中,通过在第一列中为其命名来创建复合键,然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。很少有实体的自然键是单列。相反,您必须创建一个复合索引,即跨越多个数据字段的索引。在 Access 表设计的索引对话框中,通过在第一列中为其命名来创建复合键,然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。很少有实体的自然键是单列。相反,您必须创建一个复合索引,即跨越多个数据字段的索引。在 Access 表设计的索引对话框中,通过在第一列中为其命名来创建复合键,然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。跨越多个数据字段的索引。在 Access 表设计的索引对话框中,通过在第一列中为其命名来创建复合键,然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。跨越多个数据字段的索引。在 Access 表设计的索引对话框中,通过在第一列中为其命名来创建复合键,然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。然后在第二列中添加多行(从表中的字段下拉列表中)。这样做的缺点是,如果复合唯一索引中的任何字段都是未知的,则不会获得唯一性。也就是说,如果一个字段在两条记录中都有 Null,并且其余字段相同,则不会被视为唯一性冲突,因为 Null 永远不会等于 Null。这是因为 Null 并不意味着“空”——它意味着“未知”。

Allen Browne 解释了您需要了解的有关 Null 的所有信息:

在您的图形中,您显示您正在尝试将 Company 表与 PManager 表链接。后一个表有一个 CompanyID 字段,并且您的 Company 表在其 ID 字段上有一个唯一索引,因此您只需要从 Company 表的 ID 字段到 PManager 表的 CompanyID 字段的链接。为了使您的示例正常工作(这将是无用的,因为您已经在 ID 字段上有一个唯一索引),您需要在 Company 表中创建一个跨越 ID 和 ShortName 的唯一复合键。

此外,如果 ShortName 是您希望唯一的字段(即,您不希望两个公司记录具有相同的 ShortName),则应为其添加唯一索引,无论您是否仍将 ID 字段用作你的主键。这让我回到了上面的第 1 项,在那里我描述了代理键可能导致您输入重复记录的情况,因为唯一性是由代理键建立的。每当您选择使用代理键时,您还必须在需要唯一的数据字段的任何组合上添加唯一的复合索引(注意事项 #2 中概述的关于 Null 字段的警告)。

如果您认为“代理键意味着更多索引”,那么您是正确的,因为您在同一个表上有两个唯一索引(假设您没有 Null 问题)。但是,在 SQL 中连接表时确实非常容易使用,并且数据重复也大大减少。同样,您可以避免 CASCADE UPDATE 的开销。另一方面,如果您正在查看具有自然外键的子表,则无需连接到父表即可识别父记录,因为识别该记录的数据就在其中外键字段。在某些情况下,不需要连接可能是主要的性能提升(特别是在您需要外部连接的情况下,因为外键可以为 Null)。

这实际上是一个相当大的话题,它是一种宗教论点。我坚定地站在代理键阵营,但我使用自然键来查找表,其中键是单列。我不会将自然键用于任何其他目的。也就是说,在可能的情况下(即没有 Null 问题),我在自然键上也有一个唯一索引。

希望这可以帮助。

于 2009-06-14T20:18:22.363 回答
5

实际上,您需要在名称字段上建立索引,在两侧

但是,我可以建议您加入太多吗?一般来说,从一个表到下一个表应该只有一个连接。表之间很少有一个以上的连接,而有两个以上的连接是非常罕见的。

看看这个链接: http ://weblogs.asp.net/scottgu/archive/2006/07/12/Tip_2F00_Trick_3A00_-Online-Database-Schema-Samples-Library.aspx

请注意所有表是如何通过单个关系连接在一起的?

标记为 PK 的每个字段都是主键。这些是 AUTONUMBER 字段。标记为 FK 的每个字段都是外键。这些是整数类型的索引数字字段。主键以一对多的关系连接到外键(在大多数情况下)。

99% 的时间,您不需要任何其他类型的连接。诀窍是创建具有唯一信息的表。您的数据库中有很多重复的信息。

以这种方式重组的数据库称为“规范化”数据库。在http://www.databaseanswers.org/data_models/上有很多很好的例子

于 2009-06-14T07:27:11.173 回答
0

只需加入 CompanyID。您也可以去掉 PManager 中的 Company 字段。

于 2009-06-15T17:23:05.273 回答
0

我做了以下事情,问题就解决了(我在访问中遇到了同样的参照完整性问题)。

  1. 我从 Access to Excel 中的两个表中导出数据。表 1 包含客户代码和公司的基本信息。客户代码作为主键。

  2. 表 2 包含有关与该公司关联的客户的所有信息。

  3. 我从导出到 excel 的 Table2 中删除了所有重复项。

  4. 我使用 Vlookup 检查并发现表 1 中没有 11 个客户代码。

  5. 我在访问表中添加了这些代码。我通过参照完整性链接,问题得到解决。

如果它不起作用,还要寻找外键。

于 2014-09-30T12:12:00.377 回答
-2

您需要创建一个索引。也许寻找某种创建索引按钮并在 CompanyID 上创建索引

于 2009-06-14T07:14:13.560 回答