不幸的是 MySQL 不支持 SQL 检查约束。出于兼容性原因,您可以在 DDL 查询中定义它们,但它们会被忽略。
有一个简单的替代方案
当不满足数据要求时,您可以创建BEFORE INSERT
和触发导致错误或将字段设置为其默认值的触发器。BEFORE UPDATE
BEFORE INSERT
MySQL 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 ;
在 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