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

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

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

 1 mysql> create table checkDemoTable(a int,b int,id int,primary key(id));
 2 Query OK, 0 rows affected
 3
 4 mysql> alter table checkDemoTable add constraint checkDemoConstraint check(age>0);
 5 Query OK, 0 rows affected
 6 Records: 0  Duplicates: 0  Warnings: 0
 7
 8 mysql> insert into checkDemoTable values(-2,1,1);
 9 Query OK, 1 row affected
10
11 mysql> select * from checkDemoTable;
12 +----+---+----+
13 | a  | b | id |
14 +----+---+----+
15 | -2 | 1 |  1 |
16 +----+---+----+
17 1 row in set

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

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

 1 mysql> create table checkDemoTable(a enum(‘男‘,‘女‘),b int,id int,primary key(id));
 2 Query OK, 0 rows affected
 3
 4 mysql> insert into checkDemoTable values(‘男‘,1,1);
 5 Query OK, 1 row affected
 6
 7 mysql> select * from checkDemoTable;
 8 +----+---+----+
 9 | a  | b | id |
10 +----+---+----+
11 | 男 | 1 |  1 |
12 +----+---+----+
13 1 row in set

2. 如果需要设置CHECK约束的字段范围大,且列举全部值比较困难,比如:>0的值,那就只能使用触发器来代替约束实现数据的有效性了。如下代码,可以保证a>0。

 1 mysql> create table checkDemoTable(a int,b int,id int,primary key(id));
 2 Query OK, 0 rows affected
 3
 4 mysql> delimiter ||
 5 drop trigger if exists checkTrigger||
 6 create trigger checkTrigger before insert on checkDemoTable for each row
 7 begin
 8 if new.a<=0 then set new.a=1; end if;
 9 end||
10 delimiter;
11
12 Query OK, 0 rows affected
13 Query OK, 0 rows affected
14
15 mysql> insert into checkDemoTable values(-1,1,1);
16 Query OK, 1 row affected
17
18 mysql> select * from checkDemoTable;
19 +---+---+----+
20 | a | b | id |
21 +---+---+----+
22 | 1 | 1 |  1 |
23 +---+---+----+
24 1 row in set
时间: 2024-10-12 16:52:40

MySQL关于check约束无效的解决办法的相关文章

mysql check约束无效

转自http://blog.csdn.net/maxint64/article/details/8643288 今天在mysql中尝试使用check约束时,才知道在MySQL中CHECK约束是无效的,例如下面一段代码,在创建表table1时添加了CHECK约束,要求field1字段的值大于零,随后向field1字段插入-1,这明显违反CHECK约束,但这段代码在MySQL中却可以执行成功. CREATE TABLE table1 ( field1 INT, CHECK (field1 > 0)

DATABASE CONNECTION ERROR (1): THE MYSQL ADAPTER &#39;MYSQLI&#39; IS NOT AVAILABLE.解决办法

网站迁移之后遇到:Database connection error (1): The MySQL adapter 'mysqli' is not available.这个问题,我一开始以为是我配置的参数错了呢!然后回去检查,检查好几遍我的数据库账号和密码都没错,但是为什么就是连接不上数据库呢?? 网上有人说是"可能有你安装wamp或者xamp之后,sqlserver的服务没有启动,你可以到系统服务菜单里看看这个是否自动启动."但是我问过空间商,他们说默认都是开启的,然后他们也检查了数

[ArchLinux]进行更新时出现错误:GPGME error: 无数据,数据库无效的解决办法/

今天在我进行系统更新pacman -Syu时,出现了如下错误: # pacman -Syu 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 错误:GPGME error: 无数据 :: 正在同步软件包数据库... core 已经是最新版本 0.0 B 0.00B/s 00:00 [----------------------] 0% extra 已经是最新版本 0.0 B 0.00B/

无法启动MYSQL服务”1067 进程意外终止”解决办法——汇总及终极方法

自己一开始按照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,但是到后面步骤总是出现1067代号的错误.慢慢折腾去解决. 这里汇总各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止"的一些解决办法.自己遇到这个问题是查了很多方法不行,最后看到一个论坛的讨论,试了一下竟然可以.一下是网上的部分方法,最后可以的那个方法我放在最后面: 启用MySql服务的时候出现"windows无法启动mysql服务(位于本地计算

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

在CentOS中安装MySql报错error: Failed dependencies解决办法 安装64位MySql报错内容如下:error: Failed dependencies:        libaio.so.1()(64bit) is needed by MySQL-server-5.6.19-1.el6.x86_64    libaio.so.1(LIBAIO_0.1)(64bit) is needed by MySQL-server-5.6.19-1.el6.x86_64    

ubuntu安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法

ubuntu12.04安装vmware12出现cannot ope dev/vmmon及modprobe vmmon提示密钥无效的解决办法 笔记本型号thinkpad E450C,前段时间删除了预装的windows,改成ubuntu12.04,并打算在ubuntu上安装一个windows虚拟机.下载vmware for linux并安装后,启动vmware提示"Cannot open /dev/vmmon: No such file or directory". 解决办法: 1.进入t

无法启动MYSQL服务”1067 进程意外终止”解决办法

原文:http://www.111cn.net/database/mysql/48888.htm 本文章主要是总结了各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止"的一些解决办法,有碰到mysql无法启动的同学可尝试参考. 启用MySql服务的时候出现"windows无法启动mysql服务(位于本地计算机上.错误1067:进程意外终止)",看看mysql服务并没有其它的依赖安系啊,于是突然想到进系统日志看看,果然发现很多MySql的很多错误,终

MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法

Ms - sql 数据库批量替换字符串 MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法 update ContentInfo set spcContent=replace(cast(spcContent as varchar(max)),'http://www.buy5188.com/','http://www.epowerchina.com.cn/')

IntelliJ debug grails 无效的解决办法

从Grails 2.2以后默认run-app命令将启动Grails应用程序在一个单独的Java虚拟机. 这就是所谓的分叉的Tomcat Grails中的执行. 这样的类路径Grails构建系统和应用程序也不会干预,两个进程都有自己的内存设置. 我们可以看到在grails-app / conf / BuildConfig设置. groovy在那里我们可以找到grails.project.fork.run配置属性. 当我们想要调试程序等IDE IntelliJ IDEA我们不能使用调试命令,因为这只