MySQL Workbench CHECK约束

4

我希望在记录插入数据库之前创建2个CHECK约束。

ALTER TABLE SubjectEnrollment
ADD CONSTRAINT register CHECK (register <= classSize AND register >=0),
ADD CONSTRAINT available CHECK (available <= classSize AND available >= 0);
  1. 注册属性不应大于班级大小属性,也不应小于0。
  2. 可用属性不应大于班级大小属性,也不应小于0。

当我在MySQL Workbench中输入此语法时,它会抱怨“Syntax Error: unexpected 'CHECK' (check)”。我应该如何添加这些内容,使用TRIGGER?

谢谢。


2
为什么要费心呢?MySQL不强制执行检查约束。 - Gordon Linoff
如果您需要进行检查,则可以在MySQL中使用触发器。 - juergen d
在对表进行更新之前,应该先检查班级可容纳的人数,然后再允许学生注册该科目。如果班级只能容纳40名学生,则第41名学生将无法再插入到表中。 - helloworld1234
@juergen d 怎么做,有例子吗? - helloworld1234
我在回答中添加了一个示例。 - juergen d
2个回答

3

由于MySQL 8.0.16之前的版本不支持check,因此您需要使用触发器。类似于以下创建触发器:

delimiter $$
CREATE TRIGGER some_trigger_name
BEFORE INSERT ON SubjectEnrollment
FOR EACH ROW
BEGIN    
    IF (NEW.register > NEW.classSize OR NEW.register < 0)        
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'invalid data';
    END IF;
END
$$

您需要为UPDATE定义相同的触发器。


谢谢,我可以问一下'NEW'这个词是表名吗? - helloworld1234
NEW 引用要插入表中的记录。 NEW.register 是您要插入的 register 的值。 另外,如果您定义了一个 UPDATE 触发器,则也要使用单词 NEW 引用要更新的记录。 - juergen d
非常感谢你,伙计... - helloworld1234

0

这个评论有点长。

MySQL支持check语法,但是在create table中使用:

create table (
    . . . 
    CHECK (register <= classSize AND register >= 0)
);

Check在任何引擎中都没有实现,因此它不起作用。可能因为这个原因,它不是constraint语法的一部分,因此不能用于add constraint


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接