Mysql中Check约束无效的原因以及解决方法
欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~
首先看下面这段代码:
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 affected3 4 mysql> insert into checkDemoTable values('男',1,1);5 Query OK, 1 row affected6 7 mysql> select * from checkDemoTable;8 +----+---+----+9 | a | b | id |
10 +----+---+----+
11 | 男 | 1 | 1 |
12 +----+---+----+
13 1 row in set
如果需要设置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,后续将会在其他文章中提到。更多相关代码可以访问
我的GITHUB
Mysql中Check约束无效的原因以及解决方法相关推荐
- php iis ajax 无效,IIS7中Ajax.AjaxMethod无效的原因及解决方法
最近做用Ajax.AjaxMethod方法的时候,在asp.net的服务器下一切正常,用iis的时候,js中总是cs类找不到,我就郁闷了,折腾了大半天,终于找到错误原因了. 因为我发布网站用的是iis ...
- MySQL局域网内访问慢的原因及解决方法
转载自 http://blog.csdn.net/tiantang_1986/article/details/76890178 MySQL局域网内访问慢的原因及解决方法. 出现原因:主要是因为DNS服 ...
- 使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法
http://blog.csdn.net/kfhzy/article/details/6020283 http://blog.csdn.net/kfhzy/article/details/602054 ...
- 记一次MySQL中Waiting for table metadata lock的解决方法
记一次MySQL中Waiting for table metadata lock的解决方法 参考文章: (1)记一次MySQL中Waiting for table metadata lock的解决方法 ...
- 思科ccie和华为hcie中交换机环路的产生原因和解决方法
思科ccie和华为hcie中交换机环路的产生原因和解决方法,互联网时代对于我们的生活产生了非常巨大的影响,给我们带来了很多的便利,但是同时给我们带来的还有许许多多的问题,如网络安全. 有人说过在当今的 ...
- 使用IDEA时快捷键无效的原因和解决方法
使用IDEA时快捷键无效的原因和解决方法 今天尝试用IDEA全局搜索时(Ctrl+Shift+F),发现无效. 浏览了一些博客,然后发现大家的回答出奇的一致.所以肯定是了: IDEA快捷键失效的原因, ...
- MySQL关于check约束无效的解决办法
首先看下面这段MySQL的操作,新建一个含有a和b的表,其中a用check约束必须大于0,然而插入了一条(-2,1,1)的数据,其中a=-2,也是成功插入的. 所以MySQL只是check,但是不强制 ...
- 【MySQL】Got fatal error 1236原因和解决方法
一 前言 MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到"Got fatal ...
- mysql的ERROR 1231 (42000)问题原因及解决方法
报错如下: ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL' 常见于使用source执行sql文 ...
- MySQL自增字段不连续的原因和解决方法
造成自增字段不连续的原因 1)唯一键冲突导致自增字段值不连续 示例1:创建数据表tb_student3,插入导致唯一键冲突的记录后,在插入数据 mysql> CREATE TABLE tb_st ...
最新文章
- 在Java版中被移除的物品,盘点Minecraft曾“移除”的5个物品,Mojang反悔?1.14即将加入!...
- 五个方法成为更好的程序员
- 如何使用java程序操作ActiveMQ
- Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)
- 谷歌Chrome 80稳定版更新:对浏览器进行两项重大的更改
- Laravel核心解读--Database(四) 模型关联
- 【零基础学Java】—Collections集合工具类(四十二)
- Python 3 mysql 简介安装
- 2017年——秋招面试总结(网宿、美图)
- Apache/Nginx+PHP+MySQL一键环境安装包
- VMware VirtualBox共存时桥接注意
- windows 安装 win32 win32com模块
- EasyRecovery 15win/mac易恢复序列号
- Mac OS 上MPV播放器常用快捷键
- 如何使用可提高员工敬业度的绩效管理软件
- 2025年,我的人生全被互联网巨头垄断了
- javascript字符串方法indexOf、lastIndexOf 方法的使用
- Geoffrey Hinton:放弃反向传播,我们的人工智能需要重头再来
- python的Gensim库如何使用
- WebAPI 网站发布