欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多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约束无效的原因以及解决方法相关推荐

  1. php iis ajax 无效,IIS7中Ajax.AjaxMethod无效的原因及解决方法

    最近做用Ajax.AjaxMethod方法的时候,在asp.net的服务器下一切正常,用iis的时候,js中总是cs类找不到,我就郁闷了,折腾了大半天,终于找到错误原因了. 因为我发布网站用的是iis ...

  2. MySQL局域网内访问慢的原因及解决方法

    转载自 http://blog.csdn.net/tiantang_1986/article/details/76890178 MySQL局域网内访问慢的原因及解决方法. 出现原因:主要是因为DNS服 ...

  3. 使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法

    http://blog.csdn.net/kfhzy/article/details/6020283 http://blog.csdn.net/kfhzy/article/details/602054 ...

  4. 记一次MySQL中Waiting for table metadata lock的解决方法

    记一次MySQL中Waiting for table metadata lock的解决方法 参考文章: (1)记一次MySQL中Waiting for table metadata lock的解决方法 ...

  5. 思科ccie和华为hcie中交换机环路的产生原因和解决方法

    思科ccie和华为hcie中交换机环路的产生原因和解决方法,互联网时代对于我们的生活产生了非常巨大的影响,给我们带来了很多的便利,但是同时给我们带来的还有许许多多的问题,如网络安全. 有人说过在当今的 ...

  6. 使用IDEA时快捷键无效的原因和解决方法

    使用IDEA时快捷键无效的原因和解决方法 今天尝试用IDEA全局搜索时(Ctrl+Shift+F),发现无效. 浏览了一些博客,然后发现大家的回答出奇的一致.所以肯定是了: IDEA快捷键失效的原因, ...

  7. MySQL关于check约束无效的解决办法

    首先看下面这段MySQL的操作,新建一个含有a和b的表,其中a用check约束必须大于0,然而插入了一条(-2,1,1)的数据,其中a=-2,也是成功插入的. 所以MySQL只是check,但是不强制 ...

  8. 【MySQL】Got fatal error 1236原因和解决方法

    一 前言   MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到"Got fatal ...

  9. mysql的ERROR 1231 (42000)问题原因及解决方法

    报错如下: ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL' 常见于使用source执行sql文 ...

  10. MySQL自增字段不连续的原因和解决方法

    造成自增字段不连续的原因 1)唯一键冲突导致自增字段值不连续 示例1:创建数据表tb_student3,插入导致唯一键冲突的记录后,在插入数据 mysql> CREATE TABLE tb_st ...

最新文章

  1. 在Java版中被移除的物品,盘点Minecraft曾“移除”的5个物品,Mojang反悔?1.14即将加入!...
  2. 五个方法成为更好的程序员
  3. 如何使用java程序操作ActiveMQ
  4. Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)
  5. 谷歌Chrome 80稳定版更新:对浏览器进行两项重大的更改
  6. Laravel核心解读--Database(四) 模型关联
  7. 【零基础学Java】—Collections集合工具类(四十二)
  8. Python 3 mysql 简介安装
  9. 2017年——秋招面试总结(网宿、美图)
  10. Apache/Nginx+PHP+MySQL一键环境安装包
  11. VMware VirtualBox共存时桥接注意
  12. windows 安装 win32 win32com模块
  13. EasyRecovery 15win/mac易恢复序列号
  14. Mac OS 上MPV播放器常用快捷键
  15. 如何使用可提高员工敬业度的绩效管理软件
  16. 2025年,我的人生全被互联网巨头垄断了
  17. javascript字符串方法indexOf、lastIndexOf 方法的使用
  18. Geoffrey Hinton:放弃反向传播,我们的人工智能需要重头再来
  19. python的Gensim库如何使用
  20. WebAPI 网站发布

热门文章

  1. Mysql更新关联子查询报错
  2. 【XLL 框架库函数】 TempInt/TempInt12
  3. C#对称加密(3des)和非对称加密(rsa)算法
  4. final、finally 和 finalize的区别
  5. menuconfig 菜单配置
  6. 使用Microsoft Sync Framework做文件同步
  7. C#判断一个string是否为数字 --zt
  8. 测开之路五十三:unittest运行参数
  9. [转]GO err is shadowed during return
  10. 20155308 2017-2018-1 《信息安全系统设计基础》第十三周学习总结