今天写到项目时,遇到了这个问题:msql里check约束为什么会无效?具体原因,不清楚,但是我找到了一些解决的办法
解法如下:
例如下面一段代码,创建好表A后,添加CHECK约束,要求a字段和b字段的值都大于等于0,随后向a字段和b字段随意插入-1,-2,这明显违反CHECK约束,但这段代码在MySQL里面却可以执行成。
运行结果如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcNTRU1kZ1cVW5Z0RhZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOwIjNwMTM3EzNyETM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
解决这个问题有两种方式。
1. 如果需要设置CHECK约束的字段范围小,并且比较容易列举全部的值,就可以考虑将该字段的类型设置为枚举类型 enum()或集合类型set()。
比如性别字段可以这样设置,插入枚举值以外值的操作将不被允许。
示例:
2. 如果需要设置CHECK约束的字段范围大,且列举全部值比较困难,比如:>=0的值,那就只能使用触发器来代替约束实现数据的有效性了。
下面这段代码创建了一个叫Testtb1_a_b的约束器,它将保证新插入的数据在a,b字段的值都不小于零。