MySQL 中的 CHECK 约束不起作用

首先我创建了一个类似

CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);

然后在该表中插入值

INSERT INTO Customer values ('-2','abc','zz');

MySQL 没有显示错误,它接受了这些值。

118000 次浏览

在 MySQL 中似乎没有实现 CHECK约束。

请看这个错误报告: https://bugs.mysql.com/bug.php?id=3464

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 ;

希望能帮上忙。

尝试使用 set sql_mode = 'STRICT_TRANS_TABLES'SET sql_mode='STRICT_ALL_TABLES'

MySQL 忽略了 CHECK约束,正如文档中的一个小注释所解释的那样: 译自: 美国《科学》杂志网站(http://dev.mysql.com/doc/refman/5.5/en/create-table.html)

CHECK子句会被解析,但所有存储引擎都会忽略它。

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

有一个简单的选择

您可以创建 BEFORE INSERTBEFORE UPDATE触发器,这些触发器要么导致错误,要么在数据的要求未得到满足时将字段设置为默认值。

在 MySQL 5.5之后工作的 BEFORE INSERT示例

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

正如 joanq MariaDB 提到的,现在除了其他好处之外,似乎还支持 CHECK 限制:

“支持检查约束(MDEV-7563)”

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

版本8.0.15(尚未发布)支持检查约束

Https://bugs.mysql.com/bug.php?id=3464

[23 Jan 16:24] Paul Dubois

由开发者发布: 在8.0.15中修复。

以前,MySQL 允许有限形式的 CHECK 约束语法, MySQL 现在实现了 表和列 CHECK 约束,用于所有存储引擎。 约束使用 CREATETABLE 和 ALTERTABLE 语句定义。

更新到 MySQL 8.0.16以使用 checks:

从 MySQL 8.0.16开始,CREATE TABLE 允许 TABLE 的核心特性 和列 CHECK 约束,用于所有存储引擎 允许两个表都使用以下 CHECK 约束语法 约束和列约束

MySQL 检查文档