validation - 如何使用特定字段组合将表限制为 5 条记录
问题描述
我正在使用 MS Access 2016。
假设我有一个 Student 表、一个 Subject 表(即 Geography、History 等)和一个 StudentSubject 表,它记录了每个学生选择的科目。
StudentSubject 包含 StudentId 和 SubjectId 作为外键。
任何学生不得选择超过 5 个科目。
有没有办法在表上定义验证规则,使得给定的 StudentId 可能不会出现在 StudentSubject 表中超过 5 次?
我可以通过引入一个附加表来强制执行约束,但如果可能的话,我想避免这种情况。
我还想在表级别定义一个约束,而不是使用通过表单插入记录时调用的 vba 代码。据我所知,Access 没有触发器之类的东西,就像在 sql 系统中那样。
解决方案
您可以使用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))"
另外,请记住,如果以某种方式存在违反约束的记录(例如,因为它们在添加约束之前就存在),您的表将被完全锁定。
推荐阅读
- ios - 多个表视图使用的单一 UITableViewDiffableDataSource
- javascript - 具有两种不同颜色状态的导航栏
- vb.net - 循环无法读取所有访问记录
- google-drive-api - 如何使用google api获取有权访问共享驱动器的用户列表
- node.js - 如何使用 npm 并发包同时运行 Nextjs 应用程序和 Express 服务器?
- twilio - 从测试帐户购买 Twilio 上的虚拟号码
- javascript - Chart.js 和 react-chartjs-2 属性 translate 缺少类型
- python - 在 Django 中使用 rpy2 调用 R 脚本时出错:UnicodeDecodeError, invalid continuation byte
- solidity - Solidity ParserError 应为“,”但得到“数字”
- html - 当我将鼠标悬停在 td 上时,如何使这个跨度出现?