首页 > 解决方案 > 如何使用特定字段组合将表限制为 5 条记录

问题描述

我正在使用 MS Access 2016。

假设我有一个 Student 表、一个 Subject 表(即 Geography、History 等)和一个 StudentSubject 表,它记录了每个学生选择的科目。

StudentSubject 包含 StudentId 和 SubjectId 作为外键。

任何学生不得选择超过 5 个科目。

有没有办法在表上定义验证规则,使得给定的 StudentId 可能不会出现在 StudentSubject 表中超过 5 次?

我可以通过引入一个附加表来强制执行约束,但如果可能的话,我想避免这种情况。

我还想在表级别定义一个约束,而不是使用通过表单插入记录时调用的 vba 代码。据我所知,Access 没有触发器之类的东西,就像在 sql 系统中那样。

标签: validationms-accessms-access-2016

解决方案


您可以使用CHECK约束来限制可能性:

ALTER TABLE StudentSubject 
ADD CONSTRAINT Max5Subjects 
CHECK(
    NOT EXISTS(
        SELECT 1 
        FROM StudentSubject 
        GROUP BY StudentID 
        HAVING Count(StudentID) > 5
    )
)

请注意,这可能会稍微减慢数据输入速度,尤其StudentID是在未编制索引的情况下。

检查约束需要在 ANSI 92 兼容模式下执行,或者使用 ADO(例如使用CurrentProject.Connection.Execute)。更多细节在这里

要使用 ADO 执行它,您只需在即时窗口中使用这一行:

CurrentProject.Connection.Execute "ALTER TABLE StudentSubject ADD CONSTRAINT Max5Subjects CHECK(NOT EXISTS( SELECT 1 FROM StudentSubject GROUP BY StudentID HAVING Count(StudentID) > 5))"

另外,请记住,如果以某种方式存在违反约束的记录(例如,因为它们在添加约束之前就存在),您的表将被完全锁定。


推荐阅读