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

所以MySQL只是check,但是不强制check。

mysql> create table checkDemoTable(a int,b int,id int,primary key(id));
Query OK, 0 rows affected

mysql> alter table checkDemoTable add constraint checkDemoConstraint check(a>0);
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

mysql> insert into checkDemoTable values(-2,1,1);
Query OK, 1 row affected

mysql> select * from checkDemoTable;
+----+---+----+
| a | b | id |
+----+---+----+
| -2 | 1 | 1 |
+----+---+----+
1 row in set

解决这个问题有两种办法:

  1. 如果需要设置CHECK约束的字段范围小,并且比较容易列举全部的值,就可以考虑将该字段的类型设置为枚举类型 enum()或集合类型set()。比如性别字段可以这样设置,插入枚举值以外值的操作将不被允许。

mysql> create table checkDemoTable(a enum('男','女'),b int,id int,primary key(id));
Query OK, 0 rows affected

mysql> insert into checkDemoTable values('男',1,1);
Query OK, 1 row affected

mysql> select * from checkDemoTable;
+----+---+----+
| a | b | id |
+----+---+----+
| 男 | 1 | 1 |
+----+---+----+
1 row in set

2.如果需要设置CHECK约束的字段是连续的,或者列举全部值很困难,比如正实数或正整数,那就只能用触发器来代替约束实现数据有效性了。下面这段代码创建了一个叫做TestField1_BeforeInsert的约束器,它将保证新插入的数据中 a 字段的值不小于零。

DELIMITER $$

CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON checkDemoTable
FOR EACH ROW
BEGIN
IF NEW.a < 0 THEN
SET NEW.a = 0;
END IF;
END$$

转载于:https://www.cnblogs.com/nyist-xsk/p/7278501.html

MySQL关于check约束无效的解决办法相关推荐

  1. mysql的check约束怎么设置_MySQL怎么使用check约束

    MySQL使用check约束的方法:1.如果要设置CHECK约束的字段范围小,并且比较容易列举全部的值,可以将该字段的类型设置为enum类型或set类型.2.如果需要设置CHECK约束的字段范围大,且 ...

  2. mysql删除check约束_高级SQL特性——约束与索引

    一.约束 1.约束的作用 对表中数据进行进一步限制,保证表中数据的完整性.一致性和正确性. 2.约束的分类 1)主键约束 主键能够唯一地标识表中的一行,比如学生表中的学生id. 它的主要作用就是能够将 ...

  3. check 约束无效

    mysql check 约束无效 在MYSQL中,CHECK只是一段可调用但无意义的子句.MySQL会直接忽略. 接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代 ...

  4. mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法

    mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 参考文章: (1)mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 (2)https://ww ...

  5. Can't connect to MySQL server on 'localhost' (10061)的解决办法!

    Can't connect to MySQL server on 'localhost' (10061)的解决办法! http://blog.sina.com.cn/s/blog_52ebca1f01 ...

  6. Mysql遇到Too many connections的解决办法

    Mysql遇到Too many connections的解决办法 由于线上mysql实例太多,因此也就经常遇到Too many connections的问题,这个问题也是最常见的问题,下面就结合自己的 ...

  7. 安装32位mysql报错_在CentOS中安装32位或64位MySql报错error: Failed dependencies解决办法...

    在CentOS中安装MySql报错error: Failed dependencies解决办法 安装64位MySql报错内容如下: error: Failed dependencies: libaio ...

  8. Ubuntu 修改mysql存放路径后无法启动解决办法

    Ubuntu 修改mysql存放路径后无法启动解决办法: # vi /etc/apparmor.d/usr.sbin.mysqld # /var/lib/mysql/ r, (即注释掉该行) 改为 / ...

  9. SqlServer2005/2008下sysproperties无效的解决办法

    SqlServer2005/2008下sysproperties无效的解决办法 if exists (select 1 from sysobjects where name = 'syspropert ...

最新文章

  1. openssl+poly1305+sm4实现
  2. Maven-Build Lifecycle(构建生命周期)
  3. 黄光裕:力争用未来18个月的时间 使企业恢复原有的市场地位
  4. android:layout_marginbottom=,Android: Retrieve layout_marginBottom programmatically?
  5. php flush 逐行显示_PHP逐行输出(ob_flush与flush的组合)
  6. git 添加用户名和邮箱_Git安装与基础使用
  7. nc 模拟服务器_Linux网络利器netcat/nc
  8. iovec结构体定义及使用 (转)
  9. Redis相关面试题总结
  10. 汽车电子时钟硬件设计指南
  11. 存token的最佳方式
  12. 史上讲解最好的 Docker 教程,从入门到精通(建议收藏的教程)
  13. B端产品:通过线上渠道增长
  14. 开关调色新世界BP2888电源解决方案
  15. [Android]桌面应用
  16. 一文道尽JavaScript 20年的发展史
  17. 图腾标准服务器机柜型号,图腾常用的机柜型号及全参数-20210804001933.pdf-原创力文档...
  18. 区块链跨链是如何进行验证的?
  19. 视频时长不够怎么延长
  20. 安卓手机卡顿怎么解决_安卓手机卡顿问题严重?关掉这个开关试试,手机瞬间流畅得像新的...

热门文章

  1. 嵌入式linux基础知识累积
  2. ASP.NET的SEO:HTTP报头状态码---内容重定向
  3. 何谓程序员?何谓中国的程序员?
  4. HDR (automatic exposure control + Tonemapping + Bloom)
  5. 湖北宜昌:老太不慎落入江中 小伙奋勇救人
  6. Linux web服务安装apache 思路 (源码编译,自己定义服务)
  7. Google地图搜索的触角伸向月球
  8. Yii2中你可能忽略但很有用的两个方法batcheach
  9. java8 新特性 lambda过滤
  10. Org设置让DataLoader导入数据时能导入创建日期