无法在Access中强制执行参照完整性

Tam*_* N. 1 ms-access referential-integrity

我已经检查了所有错误:主键,唯一性和类型.访问只是似乎无法链接我在我的数据库中的2个字段.有人可以看看吗?

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

谢谢.

Dav*_*ton 8

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

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

  1. 代理键:代理PK使每条记录都是唯一的.那就是你可以拥有ID为1的David Fenton和ID为2的David Fenton的记录.如果它是相同的David Fenton,你有重复的数据,但就你的数据库所知,它们是独一无二的.

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

Allen Browne解释了你需要知道的关于Nulls的一切:

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

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

如果您认为"代理键意味着更多索引"是正确的,那么您在同一个表上有两个唯一索引(假设您没有Null问题).但是,在SQL中连接表时,您确实可以轻松使用,并且数据重复性也大大降低.同样,您可以避免CASCADE UPDATE的开销.另一方面,如果您正在查看具有自然外键的子表,则无需加入父表即可识别父记录,因为标识该记录的数据就在那里外键领域.在某些情况下,缺少对连接的需求可能是一个主要的性能提升(特别是对于需要外连接的情况,因为外键可以是Null).

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

希望这可以帮助.


Rob*_*vey 5

实际上,您需要在名称字段的两侧都有索引

但是,我可以建议您加入太多连接吗?通常,从一个表到下一个表应该只有一个连接.表之间很少有多个连接,并且极少有两个以上的连接.

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

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

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

99%的情况下,您不需要任何其他类型的连接.诀窍是创建具有唯一信息的表.您的数据库中有大量重复信息.

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