Mysql中Check约束无效的原因以及解决方法
2017-11-30 22:13
417 查看
首先看下面这段代码:
很明显,CHECK语句在声明中并未起到作用,为什么呢?
原因是因为,不同于SQL,在MYSQL中,CHECK只是一段可调用但无意义的子句。MySQL会直接忽略。
CHECK子句会被分析,但是会被忽略。
请参见“CREATE TABLE语法”:接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。
解决这个问题有两种办法:
1.
如果需要设置CHECK约束的字段范围小,并且比较容易列举全部的值,就可以考虑将该字段的类型设置为枚举类型 enum()或集合类型set()。比如性别字段可以这样设置,插入枚举值以外值的操作将不被允许。
2.
如果需要设置CHECK约束的字段范围大,且列举全部值比较困难,比如:>0的值,那就只能使用触发器来代替约束实现数据的有效性了。如下代码,可以保证a>0。
此外,在MYSQL中,域(Domain)与断言(Assertion)也是无法使用的,原因类似于CHECK,后续将会在其他文章中提到
mysql> create table ss -> ( -> no int check(no <= 4 and no >= -> ); Query OK, 0 rows affected (0.11 sec) mysql> insert into ss values(1); Query OK, 1 row affected (0.01 sec) mysql> select * from ss; +------+ | no | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> insert into ss values(5); Query OK, 1 row affected (0.03 sec) mysql> select * from ss; +------+ | no | +------+ | 1 | | 5 | +------+ 2 rows in set (0.00 sec)
很明显,CHECK语句在声明中并未起到作用,为什么呢?
原因是因为,不同于SQL,在MYSQL中,CHECK只是一段可调用但无意义的子句。MySQL会直接忽略。
CHECK子句会被分析,但是会被忽略。
请参见“CREATE TABLE语法”:接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。
解决这个问题有两种办法:
1.
如果需要设置CHECK约束的字段范围小,并且比较容易列举全部的值,就可以考虑将该字段的类型设置为枚举类型 enum()或集合类型set()。比如性别字段可以这样设置,插入枚举值以外值的操作将不被允许。
1 mysql> create table checkDemoTable(a enum('男','女'),b int,id int,primary key(id)); 2 Query OK, 0 rows affected 3 4 mysql> insert into checkDemoTable values('男',1,1); 5 Query OK, 1 row affected 6 7 mysql> select * from checkDemoTable; 8 +----+---+----+ 9 | a | b | id | 10 +----+---+----+ 11 | 男 | 1 | 1 | 12 +----+---+----+ 13 1 row in set
2.
如果需要设置CHECK约束的字段范围大,且列举全部值比较困难,比如:>0的值,那就只能使用触发器来代替约束实现数据的有效性了。如下代码,可以保证a>0。
CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON checkDemoTable FOR EACH ROW BEGIN IF NEW.a < 0 THEN SET NEW.a = 0; END IF;
此外,在MYSQL中,域(Domain)与断言(Assertion)也是无法使用的,原因类似于CHECK,后续将会在其他文章中提到
相关文章推荐
- MySQL事件调度器无效的问题原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- windows7下启动mysql服务出现服务名无效的原因及解决方法
- windows7下启动mysql服务出现服务名无效的原因及解决方法
- mysql unauthenticated user原因分析以及解决方法
- thinkphp读写分离坑爹!mysql进行update更新数据时报错[HY000]:General error,原因以及解决方法
- MySQL 5.6+版本设置long_query_time的值无效的原因及解决方法
- windows7下启动mysql服务出现服务名无效的原因及解决方法
- windows7下启动mysql服务出现服务名无效的原因及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- MySQL出现Waiting for table metadata lock的原因以及解决方法
- ubuntu linux qq崩溃问题的解决方法以及原因
- [转]WebService 中Maximum request length exceeded. 产生错误的原因,以及解决方法.