问题
今天创建了一个表,想对其中一个字段进行数值范围限定,如:
create table persons (
id int primary key auto_increment,
name varchar(255) not null,
age int,
check (age > 0 and age < 150)
);
那好表后,还是能插入age不为0~150范围内的值的记录。
参照w3schools, 的确是这样写的,为什么不起作用呢?
原因
在mysql的官网教程中,13.1.17 CREATE TABLE Syntax 小节中有这样一段话:
For other storage engines, MySQL Server parses and ignores the FOREIGN KEY and REFERENCES syntax in CREATE TABLE statements. The CHECK clause is parsed but ignored by all storage engines. See Section 1.7.2.3, “Foreign Key Differences”.
Check clause 会被所有的存储引擎解析但是忽略。
解决方法
参照 stackoverflow, 创建两个触发器,在插入数据和更新数据前,对要校验的数据进行验证。
不符合条件的记录处理
通过调用一个不存在的function,来触发mysql的异常。参照这个文章。