如何使用SQL查询在Access中的字段上设置验证规则?

时间:2018-05-17 12:22:03

标签: sql validation ms-access office365 ms-access-2016

我正在使用MS Access 2016(Office 365),我目前正面临一个问题。以下是演示此问题的示例。

在这里,我创建了一个名为 NodeFamilyLink 的表,它包含两个字段:NodeID和FamilyID,如下所示。

NodeFamilyLinkTable

现在NodeID是从另一个表NodeData获得的,NodeData由3个字段组成:NodeID,NodeName和ParentID。在此表中,最初定义了所有节点,如下图所示。

NodeDataTable

现在,我想要的是在NodeFamilyLink表的NodeID列中输入一个数字,如果我输入的NodeID值未包含在NodeData表的ParentID列中,那么该NodeID值将被视为有效的一个和其他值将被视为无效值。因此,我想使用查询在NodeFamilyLink表的NodeID字段上应用验证规则。但问题是我没有在ACCESS中找到使用查询设置验证规则的选项(如下图所示)。

ExpressionBuilder

虽然我可以通过使用OLE-DB API(在VB.NET中)编程轻松实现相同目的,但我想知道是否有任何方法可以帮助我完成任务而无需编写任何代码它。请帮忙。

2 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找DLookup()函数...这允许您在不编写代码的情况下在另一个表中执行查询类型查找。 How do I go about using DLookup in a validation rule of a text box on a form in access

但这里的一个重要区别是DLookup()功能仅在表单级别的验证上下文中可用,而不是级别。

Not available at table level

Available at form level

根据您想要使用验证的具体位置,这可能为您提供了一个可行的选项,可以在不编写代码的情况下将查询类型查找作为验证规则的一部分。

答案 1 :(得分:0)

您可能正在寻找CHECK约束:

ALTER TABLE NodeFamilyLink
ADD CONSTRAINT myConstraintName
CHECK (
   NOT EXISTS( SELECT 1 FROM NodeFamilyLink INNER JOIN NodeData ON NodeData.ParentID = NodeFamilyLink.NodeID)
)

请注意,这些只能通过ADO(使用CurrentProject.Connection.Execute)添加,或者当数据库使用ANSI-92兼容语法时添加。