博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql check约束无效
阅读量:5064 次
发布时间:2019-06-12

本文共 911 字,大约阅读时间需要 3 分钟。

转自

 

今天在mysql中尝试使用check约束时,才知道在MySQL中CHECK约束是无效的,例如下面一段代码,在创建表table1时添加了CHECK约束,要求field1字段的值大于零,随后向field1字段插入-1,这明显违反CHECK约束,但这段代码在MySQL中却可以执行成功。

  1. CREATE TABLE table1  
  2. (  
  3.     field1 INT,  
  4.     CHECK (field1 > 0)  
  5. );  
  6. INSERT INTO table1 VALUES (-1);  
  7. SELECT * FROM table1;  

运行结果:

  1. +--------+  
  2. | field1 |  
  3. +--------+  
  4. |     -1 |  
  5. +--------+  
  6. 1 row in set (0.00 sec)  

解决这个问题有两种方式。如果需要设置CHECK约束的字段值离散的,并且能很容易列举全部可能值,就可以考虑将该字段的类型设置为枚举类型enum()或集合类型set()。比如性别字段可以这样设置,插入枚举值以外值的操作将不被允许:

  CREATE TABLE table1  
  1. (  
  2.     gender ENUM('男', '女')  
  3. );  
  4. INSERT INTO table1 VALUES ('秀吉');-- 此次插入操作将失败  

不过enum()类型和set()类型之间还有些小区别,上有说明。

 

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

  1. DELIMITER $$      
  2.   
  3. CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON table1  
  4. FOR EACH ROW  
  5. BEGIN  
  6.     IF NEW.field1 < 0 THEN  
  7.         SET NEW.field1 = 0;  
  8.     END IF;  
  9. END$$ 

转载于:https://www.cnblogs.com/lisuyun/p/4195366.html

你可能感兴趣的文章
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
POJ3250 Bad Hair Day(单调栈)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
查看>>
struts2中<s:form>的应用
查看>>
QML学习笔记之一
查看>>
7NiuYun云存储UploadPicture
查看>>
Window 的引导过程
查看>>
python与 Ajax跨域请求
查看>>
Java实体书写规范
查看>>
App右上角数字
查看>>
从.NET中委托写法的演变谈开去(上):委托与匿名方法
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
贪吃蛇游戏改进
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
查看>>