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)
  • 在新字段+学生标识符上创建唯一索引
  • 如果你做到了以上几点,那么每个学生不可能有超过8条记录


    也就是说,像这样的规则最好在应用程序级别实施,而不是在数据库中实施。

    理论上,您可以在数据库中实施这样的约束,如下所示:

  • 添加一个
    int
    字段
  • 添加一个约束,使新的
    int
    必须介于1和8之间(包括1和8)
  • 在新字段+学生标识符上创建唯一索引
  • 如果你做到了以上几点,那么每个学生不可能有超过8条记录


    也就是说,像这样的规则最好在应用程序级别执行,而不是在数据库中执行。

    您使用的是什么rdbms?这是一个来自样本调查问卷的问题。任何rdbms都可以。如果您能为MYSQL或SQL Server提供解决方案,将非常有帮助。谢谢。你在使用什么关系数据库?这是一个来自样本问卷的问题。任何rdbms都可以。如果您能为MYSQL或SQL Server提供解决方案,将非常有帮助。非常感谢。