首先我创建了一个像
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
然后在该表中插入值
INSERT INTO Customer values ('-2','abc','zz');
MySQL没有显示错误,它接受了值。
首先我创建了一个像
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
然后在该表中插入值
INSERT INTO Customer values ('-2','abc','zz');
MySQL没有显示错误,它接受了值。
Answers:
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 ;
希望有帮助。
CHECK
定义的约束,在MySQL中开发10分钟还是15分钟才能发出警告。啊,那太简单了……
不幸的是,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而言实际上没有意义tho
编辑: 删除了流浪报价。
关于:=
运营商:
不同于
=
,:=
运算符永远不会被解释为比较运算符。这意味着您可以:=
在任何有效的SQL语句中(不仅在SET语句中)使用来为变量分配值。
https://dev.mysql.com/doc/refman/5.6/zh-CN/assignment-operators.html
关于反引号标识符引号:
标识符引号是反引号(“`”)
如果启用了ANSI_QUOTES SQL模式,则也允许在双引号中引起标识符
DELIMITER
?
CHECK
MySQL会忽略约束,如文档中的小注释中所述: CREATE TABLE
该
CHECK
子句已解析,但所有存储引擎均将其忽略。
CHECK
约束条件的其他DBMS中,如果CHECK
求值不正确,则FALSE
插入(或更新)操作未完成,并导致错误。
该CHECK
约束似乎并没有在MySQL中实现。
查看此错误报告:https : //bugs.mysql.com/bug.php?id=3464
如joanq所述,MariaDB现在似乎支持CHECK约束以及其他优点:
“支持CHECK CONSTRAINT(MDEV-7563)。”
https://mariadb.com/kb/zh-CN/mariadb/mariadb-1021-release-notes/
自版本8.0.15起支持检查约束(尚未发布)
https://bugs.mysql.com/bug.php?id=3464
[1月23日16:24] Paul Dubois
开发者发布:在8.0.15中修复。
以前,MySQL允许使用有限形式的CHECK约束语法,但会对其进行分析和忽略。MySQL现在为所有存储引擎实现了表和列CHECK约束的核心功能。使用CREATE TABLE和ALTER TABLE语句定义约束。
尝试使用set sql_mode = 'STRICT_TRANS_TABLES'
ORSET sql_mode='STRICT_ALL_TABLES'
CHECK
约束条件的数据