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
解决这个问题有两种办法:
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约束的字段范围大,且列举全部值比较困难,比如:>0的值,那就只能使用触发器来代替约束实现数据的有效性了。如下代码,可以保证a>0。
mysql> create table checkDemoTable(a int,b int,id int,primary key(id));
Query OK, 0 rows affected mysql> delimiter ||
drop trigger if exists checkTrigger||
create trigger checkTrigger before insert on checkDemoTable for each row
begin
if new.a<=0 then set new.a=1; end if;
end||
delimiter; Query OK, 0 rows affected
Query OK, 0 rows affected mysql> insert into checkDemoTable values(-1,1,1);
Query OK, 1 row affected mysql> select * from checkDemoTable;
+---+---+----+
| a | b | id |
+---+---+----+
| 1 | 1 | 1 |
+---+---+----+
1 row in set
MySQL关于check约束无效的解决办法的更多相关文章
- mysql check约束无效
转自http://blog.csdn.net/maxint64/article/details/8643288 今天在mysql中尝试使用check约束时,才知道在MySQL中CHECK约束是无效的, ...
- 解析php file_exists无效的解决办法
php中file_exists无效的解决办法. 方法1 :据官方手册上描述若php教程的safe mode相关的设置过于苛刻,就会出现这样的情形:尽管文件真实存在也被误报,认为文件不存在. 由于服务器 ...
- Mysql文件太大导入失败解决办法总结
Mysql文件太大导入失败解决办法总结 在使用phpmyadmin导入数据库的时候可能会碰到由于数据库文件太大而无法导入的问题! 英文提示如下:File exceeds the maximum all ...
- 无法启动MYSQL服务”1067 进程意外终止”解决办法
原文:http://www.111cn.net/database/mysql/48888.htm 本文章主要是总结了各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止& ...
- Android layout_margin 无效的解决办法
http://www.aichengxu.com/view/31025 1.如果LinearLayout中使用Android:layout_marginRight不起作用,通过测试原来在android ...
- 无法启动mysql服务”1067 进程意外终止”解决办法【简记】
本文章主要是总结了各种导致mysql提示无法启动MYSQL服务”1067 进程意外终止”的一些解决办法,有碰到mysql无法启动的同学可尝试参考. 在win7的服务器里开启MySql服务提示“wind ...
- 360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法
360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法 同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安 ...
- win7 Host文件修改后无效的解决办法
win7 Host文件修改后无效的解决办法 正常情况下hosts文件随时修改随时生效,如果出现修改后不生效的情况,首先确定文件是ascii编码,以windows格式为换行符,然后依次采用如下方法 1 ...
- mysql的大量的sleep进程解决办法
mysql的大量的sleep进程解决办法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/liuyong0507/article/detai ...
随机推荐
- 每天一个linux命令(28)--gzip命令
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip 是在Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip 不仅 ...
- 探究CSS中的包裹性
之前一直都知道css中的部分元素具有包裹性,今天写博客的时候正好也遇到了一个,所以想总结一下,有错误的地方欢迎指出来. 什么是包裹性? 包裹性就是父元素的宽度会收缩到和内部元素宽度一样. 哪些元素具有 ...
- ELK日志套件安装与使用
1.ELK介绍 ELK不是一款软件,而是elasticsearch+Logstash+kibana三款开源软件组合而成的日志收集处理套件,堪称神器.其中Logstash负责日志收集,elast ...
- Digital Tutors - Introduction to Scripting Shaders in Unity 学习笔记
1. Overview 2. Understanding Shader definition:code that define what the material can do in the envi ...
- Linux部署与基本指令
把以前写的linux发布一下下吧,写的真的好差劲... Linux部署 chmod:改变一个文件的权限 改变abc的权限为777 常用的权限: 777-644-755 ************** ...
- 算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 526 Solved: 365[Submi ...
- [Spark] - SparkCore程序优化总结
http://spark.apache.org/docs/1.6.1/tuning.html1) 代码优化 a. 对于多次使用的RDD,进行数据持久化操作(eg: cache.persist) b. ...
- JavaGUI版本销售管理系统
不知不觉中,本科阶段已经走过两个年头,诸多感慨,诸多向往,周遭的人和事物在不断的改变着,自己的目标也在不断改变,总之,世界一直在快速的发生着变化,快到我们无法捕捉,总的来说,过得很潇洒,就等考上研究生 ...
- yii2.0下拉列表的使用
第一种方法:ActiveForm 类的 dropDownList 方法(优点,默认使用yii的样式) 1.在控制器的方法里面 ,我们需要拿到数据,一定是 findAll() 或者是 all() 方法的 ...