什么是“CheckConstraint”?这是一项新功能,它指定在将值插入或更新到行之前检查值的条件。如果表的任何行的搜索条件结果为FALSE,则约束可能会返回错误(但如果结果为UNKNOWN或TRUE,则约束不会返回错误)。这个特性在MySQL8.0.16开始工作,在以前的版本中我们可以创建它,但是它没有工作,这意味着支持语法,但它没有工作。使用规则要牢记:不允许使用AUTO_INCREMENT列引用另一个表中的其他列不允许使用存储函数和用户自定义函数不允许使用存储过程和函数参数不允许在外键中使用子查询用于后续操作的列(ONUPDATE,ONDELETE)不允许为下一个语句INSERT、UPDATE、REPLACE、LOADDATA和LOADXML评估此表。此外,此监视约束针对INSERTIGNORE、UPDATEIGNORE、LOADDATA…IGNORE和LOADXML…IGNORE进行评估。对于这些语句,如果约束的计算结果为FALSE,则会出现警告。跳过插入或更新。查看一些示例,我创建了下表来测试此功能。如示例所示,这非常简单:CREATETABLEusers(idintnotnullauto_increment,firstnamevarchar(50)notnull,lastnamevarchar(50)notnull,ageTINYINTunsignednotnullCONSTRAINT`check_1`CHECK(age>15),genderENUM('M','F')notnull,主键(id))引擎=innodb;在这个简单的测试中,我们只能在age>15时写入或更新行。让我们看一个例子,尝试插入一行age<15:mysql>INSERTINTOusersSETfirstname='Name1',lastname='LastName1',age=10,gender='M';ERROR3819(HY000):违反了检查约束“check_1”。删除,使用下例:ALTERTABLEusersDROPCHECKcheck_1;让我们看另一个例子,给它添加更多的逻辑。我用下一个检查更改了表:ALTERTABLEusersADDCONSTRAINTgender_maleCHECK(CASEWHENgender='M'THENCASEWHENage>=21THEN1ELSE0ENDELSE1END=1);ALTERTABLEusersADDCONSTRAINTgender_femaleCHECK(CASEWHENgender='F'THENCASEWHENage>=18THEN1ELSE0END=1);ALTERTABLEusersADDCONSTRAINTgender_femaleCHECK(CASEWHENgender='F'THENCASEWHENage>=18THEN1ELSE0END=1);现在它又增加了1个逻辑;SEENCASEWHENage>=18THEN1ELSE0END=1)在性别和年龄列上。当且仅当表行的指定条件的计算结果为TRUE或UNKNOWN(对于NULL列值)时,才会满足CHECK监视约束,否则违反约束。让我们看一个前面逻辑的例子。mysql>INSERTINTOusersSETfirstname='Name2',lastname='LastName2',age=10,gender='F';ERROR3819(HY000):Checkconstraint'gender_female'isviolated.mysql>INSERTINTOusersSETfirstname='Name3',lastname='LastName3',年龄=10,性别='M';ERROR3819(HY000):违反了检查约束“gender_male”。正如您在错误消息中看到的,MySQL正在显示CHECK约束名称。可以从应用程序源代码中使用它来调试错误并知道是哪个CHECK失败了。最后,这是表结构:CREATETABLE`users`(`id`int(11)NOTNULLAUTO_INCREMENT,`firstname`varchar(50)NOTNULL,`lastname`varchar(50)NOTNULL,`age`tinyint(3)unsignedNOTNULL,`性别`enum('M','F')NOTNULL,PRIMARYKEY(`id`),CONSTRAINT`gender_female`CHECK(((casewhen(`gender`='F')then(casewhen(`age`>18)then1else0end)else1end)=1)),CONSTRAINT`gender_male`CHECK(((casewhen(`gender`='M')then(casewhen(`age`>21)then1else0end)else1end)=1)))ENGINE=InnoDBAUTO_INCREMENT=4;我们可以利用这个特性在表中添加更多的逻辑,但是根据我以前作为程序员的经验,我不建议在表中添加逻辑,因为除非你没有访问应用程序代码的权限,否则很难做到查找或调试错误。
