zoukankan      html  css  js  c++  java
  • mysql check约束无效

    转自http://blog.csdn.net/maxint64/article/details/8643288

    今天在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$$ 
  • 相关阅读:
    一致性 hash 算法( consistent hashing )a
    wcf 推送 与 广播
    TFS 自动同步Server 端文件的批处理命令
    PHP面向对象
    H5缓存机制浅析-移动端Web加载性能优化【干货】
    100+ 超全的web开发工具和资源
    从零开始搭建论坛(一):Web服务器与Web框架
    JQuery:选择器
    JQuery:事件
    JQuery:DOM操作
  • 原文地址:https://www.cnblogs.com/lisuyun/p/4195366.html
Copyright © 2011-2022 走看看