Access 2007一对二列引用完整性

时间:2009-11-12 19:33:26

标签: ms-access ms-access-2007

设定:
一个名为documents的表格,其中列author_idreviewer_id(以及其他) 一个名为users的表格,列user_id

我需要创建两个参照完整性链接:
user_idauthor_id之间的一对多。
user_idreviewer_id之间的一对多。

换句话说,documents中的这两列彼此独立,但两者都应具有有效user_id的值。

添加其中任何一种关系都可以。当我尝试在Edit Relationships窗口中添加第二个关系时,Access会抱怨以下消息:

Microsoft Office Access无法强制实施此关系的参照完整性。

我搜索过,但找不到任何解决方法。关于如何配置这种关系的任何想法?

3 个答案:

答案 0 :(得分:6)

要将一个表中的两个单独关系添加到另一个表中的两个不同字段,您需要在关系窗口中拥有父表的多个实例。

因此,您需要将“用户和文档”表添加到关系窗口并创建第一个关系。然后将Users表第二次添加到关系窗口(它将别名为Users_1),然后从该别名副本添加第二个关系。

这与你在QBE中定义两个这样的连接的方式完全一致,所以我认为它根本没有问题。但它不一定显而易见!

答案 1 :(得分:1)

这不是您问题的直接答案,但如果我是您,我会使用其他数据模型通过创建第三个来实现DocumentsUsers之间复杂的多对多关系名为DocumentsUsers的表格包含以下字段:

PK  documentUser_id (*)
FK  document_id
FK  user_id
    documentUser_type

(*) or you could alternatively use document_id + user_id as a PK... 

documentUser_type字段将保存关系类型,即“用户”,“审阅者”等。通过使用此模型,您可以为同一本书提供多个用户和/或多个审阅者,这可能更接近于现实。您甚至可以使用其他关系类型,例如“作者”等。

答案 2 :(得分:0)

首先,我建议您将列的名称分别更改为author_user_idreviewer_user_id,以明确每个引用user_id

其次,您应该知道使用Access的UI工具不是强制性的。我们中的许多人发现它们不直观,但幸福的是有其他选择。一种是使用SQL DDL,例如ANSI-92 Query Mode

ALTER TABLE Documents ADD 
   CONSTRAINT fk__ document_author_user_id__Users
   FOREIGN KEY (author_user_id)
   REFERENCES Users (user_id)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION
;

ALTER TABLE Documents ADD 
   CONSTRAINT fk__ reviewer_user_id__Users
   FOREIGN KEY (reviewer_user_id)
   REFERENCES Users (user_id)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION
;

第三,考虑您可能需要CHECK约束(或表格[sic]验证规则)以确保用户无法查看自己的工作,例如

ALTER TABLE Documents ADD 
   CONSTRAINT document_author_cannot_review_their_own_work
   CHECK (author_user_id <> reviewer_user_id)
;