Sql 来自最大子记录数的表约束
考虑以下模式以帮助学生学习和学习几门课程Sql 来自最大子记录数的表约束,sql,Sql,考虑以下模式以帮助学生学习和学习几门课程 Student(Regno:integer, Sname:string, Degree:string, Age:integer) Course(Coursecode:string, Cname:string, Credit:integer) Enrolled(Regno:integer, Coursecode:string) 我的问题是,SQL脚本可以确保学生最多注册8门课程吗? 是否有可能使用约束来实现这一点 可以使用SQL Server,但不能仅使
Student(Regno:integer, Sname:string, Degree:string, Age:integer)
Course(Coursecode:string, Cname:string, Credit:integer)
Enrolled(Regno:integer, Coursecode:string)
我的问题是,SQL脚本可以确保学生最多注册8门课程吗?
是否有可能使用约束来实现这一点 可以使用SQL Server,但不能仅使用约束。最简单的方法是使用insert/update触发器,如果您尝试为学生注册过多课程,该触发器将回滚 假设
登记的
表对注册号
和课程代码
的组合有唯一的约束(它应该是-应该是它的主键),您可以使用如下简单的触发器:
CREATE TRIGGER EnsureMaxEnrolled
ON Enrolled
FOR INSERT, UPDATE
AS
IF EXISTS (
SELECT 1
FROM Enrolled As E
JOIN Inserted As I
ON E.Regno = I.Regno
GROUP BY E.Regno
HAVING COUNT(*) > 8
)
ROLLBACK TRANSACTION;
GO
然而,对于使用这样一个触发器,我可能会三思而后行——要求每个学生最多上几门课是一项业务要求,我认为数据库的工作不是强制执行业务规则。使用SQL Server是可能的,但不能只使用约束。最简单的方法是使用insert/update触发器,如果您尝试为学生注册过多课程,该触发器将回滚 假设
登记的
表对注册号
和课程代码
的组合有唯一的约束(它应该是-应该是它的主键),您可以使用如下简单的触发器:
CREATE TRIGGER EnsureMaxEnrolled
ON Enrolled
FOR INSERT, UPDATE
AS
IF EXISTS (
SELECT 1
FROM Enrolled As E
JOIN Inserted As I
ON E.Regno = I.Regno
GROUP BY E.Regno
HAVING COUNT(*) > 8
)
ROLLBACK TRANSACTION;
GO
然而,对于使用这样的触发器,我可能会三思而后行——要求每个学生最多上几门课是一项业务要求,我认为强制执行业务规则不是数据库的工作。理论上,您可以在数据库中强制执行这样的约束,如下所示:
int
字段int
必须介于1和8之间(包括1和8)也就是说,像这样的规则最好在应用程序级别实施,而不是在数据库中实施。理论上,您可以在数据库中实施这样的约束,如下所示:
int
字段int
必须介于1和8之间(包括1和8)也就是说,像这样的规则最好在应用程序级别执行,而不是在数据库中执行。您使用的是什么rdbms?这是一个来自样本调查问卷的问题。任何rdbms都可以。如果您能为MYSQL或SQL Server提供解决方案,将非常有帮助。谢谢。你在使用什么关系数据库?这是一个来自样本问卷的问题。任何rdbms都可以。如果您能为MYSQL或SQL Server提供解决方案,将非常有帮助。非常感谢。