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)
希望有所帮助.
Mic*_*eim 72
不幸的是,MySQL不支持SQL检查约束.您可以出于兼容性原因在DDL查询中定义它们,但它们只是被忽略.
有一个简单的选择
您可以创建BEFORE INSERT和BEFORE 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
ype*_*eᵀᴹ 50
CHECK MySQL会忽略约束,如文档中的微小评论中所述: CREATE TABLE
该
CHECK子句被解析但被所有存储引擎忽略.
正如joanq所提到的,MariaDB现在似乎支持其他好东西中的CHECK约束:
"支持CHECK CONSTRAINT(MDEV-7563)."
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/