MySQL中的CHECK约束不起作用

Joh*_*aja 126 mysql check-constraints

首先,我创建了一个像

CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);
Run Code Online (Sandbox Code Playgroud)

然后在该表中插入值

INSERT INTO Customer values ('-2','abc','zz');
Run Code Online (Sandbox Code Playgroud)

MySQL没有显示错误,它接受了值.

小智 137

MySQL 8.0.16是第一个支持CHECK约束的版本.

阅读https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html

如果你使用MySQL 8.0.15或更早版本,MySQL参考手册说:

CHECK子句被解析但被所有存储引擎忽略.

尝试触发......

mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD<0 THEN 
    -> SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 这是一个巨大的闪光彩虹的原因之一,我将永远使用PostgreSQL而不是MySQL给予任何选择. (38认同)
  • 在这里,您将找到如何触发错误:http://stackoverflow.com/a/7189396/1144966 (7认同)
  • 我想知道如果解析器遇到定义的`CHECK`约束,在MySQL中开发10分钟或15分钟是否会发出警告.啊,那太简单了...... (5认同)

Mic*_*eim 72

不幸的是,MySQL不支持SQL检查约束.您可以出于兼容性原因在DDL查询中定义它们,但它们只是被忽略.

有一个简单的选择

您可以创建BEFORE INSERTBEFORE UPDATE触发导致错误的触发器,或者在不满足数据要求时将字段设置为其默认值.

BEFORE INSERTMySQL 5.5之后的工作示例

DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH( NEW.ID ) < 4 THEN
        SIGNAL SQLSTATE '12345'
            SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
    END IF;
END$$   
DELIMITER ;  
Run Code Online (Sandbox Code Playgroud)

在MySQL 5.5之前,您必须导致错误,例如调用未定义的过程.

在这两种情况下,这都会导致隐式事务回滚.MySQL不允许在程序和触发器中使用ROLLBACK语句.

如果你不想回滚事务(INSERT/UPDATE应该通过一个失败的"检查约束",你可以覆盖使用SET NEW.ID = NULL它将id设置为字段默认值的值,对于id来说真的没有意义寿

编辑: 删除了流浪的报价.

关于:=运营商:

与此不同=,:=操作符永远不会被解释为比较运算符.这意味着您可以:=在任何有效的SQL语句(不仅仅是在SET语句中)中使用它来为变量赋值.

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

关于反引号标识符引号:

标识符引号字符是反引号("`")

如果启用了ANSI_QUOTES SQL模式,则还允许在双引号内引用标识符

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

  • ......不是很简单,至少与CHECK相比:(.Coupla tutes:http://net.tutsplus.com/tutorials/databases/introduction-to-mysql-triggers/,http://www.sitepoint.com /如何到创建MySQL的,触发器/ (7认同)

ype*_*eᵀᴹ 50

CHECK MySQL会忽略约束,如文档中的微小评论中所述: CREATE TABLE

CHECK子句被解析但被所有存储引擎忽略.

  • @thefiloe:正确,在其他DBMS中正确实现`CHECK`约束,如果`CHECK`计算结果为'FALSE',则插入(或更新)没有完成,导致错误. (2认同)

rya*_*ogo 15

这个CHECK约束似乎没有在MySQL中实现.

请参阅此错误报告:https://bugs.mysql.com/bug.php?id = 3464


Mar*_*len 8

正如joanq所提到的,MariaDB现在似乎支持其他好东西中的CHECK约束:

"支持CHECK CONSTRAINT(MDEV-7563)."

https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/