MySQL关于check约束无效的解决办法
首先看下面这段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
解决这个问题有两种办法:
- 如果需要设置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约束无效的解决办法相关推荐
- mysql的check约束怎么设置_MySQL怎么使用check约束
MySQL使用check约束的方法:1.如果要设置CHECK约束的字段范围小,并且比较容易列举全部的值,可以将该字段的类型设置为enum类型或set类型.2.如果需要设置CHECK约束的字段范围大,且 ...
- mysql删除check约束_高级SQL特性——约束与索引
一.约束 1.约束的作用 对表中数据进行进一步限制,保证表中数据的完整性.一致性和正确性. 2.约束的分类 1)主键约束 主键能够唯一地标识表中的一行,比如学生表中的学生id. 它的主要作用就是能够将 ...
- check 约束无效
mysql check 约束无效 在MYSQL中,CHECK只是一段可调用但无意义的子句.MySQL会直接忽略. 接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代 ...
- mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法
mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 参考文章: (1)mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法 (2)https://ww ...
- 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 ...
- Mysql遇到Too many connections的解决办法
Mysql遇到Too many connections的解决办法 由于线上mysql实例太多,因此也就经常遇到Too many connections的问题,这个问题也是最常见的问题,下面就结合自己的 ...
- 安装32位mysql报错_在CentOS中安装32位或64位MySql报错error: Failed dependencies解决办法...
在CentOS中安装MySql报错error: Failed dependencies解决办法 安装64位MySql报错内容如下: error: Failed dependencies: libaio ...
- Ubuntu 修改mysql存放路径后无法启动解决办法
Ubuntu 修改mysql存放路径后无法启动解决办法: # vi /etc/apparmor.d/usr.sbin.mysqld # /var/lib/mysql/ r, (即注释掉该行) 改为 / ...
- SqlServer2005/2008下sysproperties无效的解决办法
SqlServer2005/2008下sysproperties无效的解决办法 if exists (select 1 from sysobjects where name = 'syspropert ...
最新文章
- openssl+poly1305+sm4实现
- Maven-Build Lifecycle(构建生命周期)
- 黄光裕:力争用未来18个月的时间 使企业恢复原有的市场地位
- android:layout_marginbottom=,Android: Retrieve layout_marginBottom programmatically?
- php flush 逐行显示_PHP逐行输出(ob_flush与flush的组合)
- git 添加用户名和邮箱_Git安装与基础使用
- nc 模拟服务器_Linux网络利器netcat/nc
- iovec结构体定义及使用 (转)
- Redis相关面试题总结
- 汽车电子时钟硬件设计指南
- 存token的最佳方式
- 史上讲解最好的 Docker 教程,从入门到精通(建议收藏的教程)
- B端产品:通过线上渠道增长
- 开关调色新世界BP2888电源解决方案
- [Android]桌面应用
- 一文道尽JavaScript 20年的发展史
- 图腾标准服务器机柜型号,图腾常用的机柜型号及全参数-20210804001933.pdf-原创力文档...
- 区块链跨链是如何进行验证的?
- 视频时长不够怎么延长
- 安卓手机卡顿怎么解决_安卓手机卡顿问题严重?关掉这个开关试试,手机瞬间流畅得像新的...