【问题标题】:MySql workbench CHECK constraint [duplicate]MySql工作台CHECK约束[重复]
【发布时间】:2016-12-27 14:11:36
【问题描述】:

这里我想在记录插入数据库之前创建2个CHECK约束。

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

当我在 MySql Workbench 中输入此语法时,它会抱怨“语法错误:意外 'CHECK' (check)'。我应该如何使用 TRIGGER 添加这些?

谢谢。

【问题讨论】:

  • 何必呢? MySQL 不强制检查约束。
  • 如果您需要检查,请使用 MySQL 中的触发器
  • 在更新表格之前,它应该在允许学生注册主题之前检查可用的班级规模。如果班级只有 40 名学生,则第 41 名学生不能再插入表中。
  • @juergen d 如何制作,有什么例子吗?
  • 我在答案中添加了一个示例

标签: mysql mysql-workbench check-constraints


【解决方案1】:

评论有点长。

MySQL 支持check 的语法,但在create table 中:

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

Check 实际上并没有在任何引擎中实现,所以这没有任何作用。大概出于这个原因,它不是constraint 语法的一部分,因此不适用于add constraint

【讨论】:

    【解决方案2】:

    由于 MySQL 不支持check,因此您需要一个触发器。像这样的 CREATE 触发器:

    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
    $$
    

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

    【讨论】:

    • 谢谢,请问'NEW'这个词是表名吗?
    • NEW 引用要插入到表中的记录。 NEW.register 是您要插入的 register 的值。顺便说一句,如果您定义了一个 UPDATE 触发器,那么还可以使用单词 NEW 来引用您要更新的记录
    • 非常感谢,伙计...
    猜你喜欢
    • 2013-05-10
    • 2016-03-12
    • 1970-01-01
    • 2011-01-08
    • 2021-02-21
    • 2015-10-08
    相关资源
    最近更新 更多