创建LessonSchedule表时CHECK约束报错及ON DELETE写法咨询
问题描述
已创建以下两张表:
CREATE TABLE Horse ( ID SMALLINT UNSIGNED AUTO_INCREMENT, RegisteredName VARCHAR(15), PRIMARY KEY (ID)) CREATE TABLE Student ( ID SMALLINT UNSIGNED AUTO_INCREMENT, FirstName VARCHAR(20), LastName VARCHAR(30), PRIMARY KEY (ID))
需要创建第三张LessonSchedule表,满足以下要求:
- HorseID:取值范围0至65000的整数,非空,作为主键的一部分,外键关联
Horse(ID) - StudentID:取值范围0至65000的整数,外键关联
Student(ID) - LessonDateTime:日期时间类型,非空,作为主键的一部分
- 当
Horse表中某行被删除时,LessonSchedule表中对应HorseID的行自动删除 - 当
Student表中某行被删除时,LessonSchedule表中对应StudentID自动设为NULL
编写的创建语句如下:
CREATE TABLE LessonSchedule ( HorseID SMALLINT UNSIGNED NOT NULL CHECK(HorseID BETWEEN 0 AND 65000), StudentID SMALLINT UNSIGNED CHECK(StudentID BETWEEN 0 AND 65000), LessonDateTime DATETIME NOT NULL, PRIMARY KEY (HorseID, LessonDateTime), FOREIGN KEY(HorseID) REFERENCES Horse(ID) ON DELETE CASCADE, FOREIGN KEY(StudentID) REFERENCES Student(ID) ON DELETE SET NULL)
收到报错信息:
Column 'StudentID' cannot be used in a check constraint 'lessonschedule_chk_2': needed in a foreign key constraint 'lessonschedule_ibfk_2' referential action.
咨询两个问题:
- 根据该报错信息,我的SQL语句存在什么问题?
- 将两个
ON DELETE子句放在对应外键语句末尾的写法是否正确?
解答
问题1:SQL语句存在的问题
报错的核心原因是StudentID字段的CHECK约束与外键的ON DELETE SET NULL动作冲突。
ON DELETE SET NULL会在Student表的行被删除时,将LessonSchedule表中对应行的StudentID设为NULL,但你给StudentID添加的CHECK(StudentID BETWEEN 0 AND 65000)约束不允许NULL值(SMALLINT UNSIGNED本身也不支持负数,而NULL不属于0-65000的范围)。当触发外键的SET NULL操作时,会直接违反CHECK约束,因此数据库拒绝创建该表。
解决思路:
- 方案一:修改StudentID的定义,允许NULL值,同时调整CHECK约束兼容NULL:将
StudentID SMALLINT UNSIGNED CHECK(StudentID BETWEEN 0 AND 65000)改为StudentID SMALLINT UNSIGNED NULL CHECK(StudentID IS NULL OR StudentID BETWEEN 0 AND 65000) - 方案二:直接删除StudentID的CHECK约束,因为外键已关联到Student表的ID字段(SMALLINT UNSIGNED AUTO_INCREMENT的取值范围是0-65535,和你要求的0-65000基本重合,外键约束已经能保证StudentID是合法的Student表ID值,无需额外添加CHECK约束)
问题2:ON DELETE子句的写法是否正确
这种写法是完全正确的。
在SQL标准和主流数据库(如MySQL、PostgreSQL)的语法规范中,定义外键时,ON DELETE CASCADE、ON DELETE SET NULL这类参照动作就是直接写在REFERENCES子句的末尾,分别对应不同外键的删除行为,你的写法符合规范。
内容的提问来源于stack exchange,提问作者Oasis101
相关产品推荐
相关产品推荐

