zoukankan      html  css  js  c++  java
  • 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约束的字段是连续的,或者列举全部值很困难,比如正实数或正整数,那就只能用触发器来代替约束实现数据有效性了。下面这段代码创建了一个叫做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$$

  • 相关阅读:
    Hive初识(一)
    图解HTTP总结(8)——确认访问用户身份的认证
    Android 7.0 照相 FileUriExposedException
    activity跳转的一些坑
    gopath配置
    android项目中记录
    一些趣味性总结(JAVA)
    http的response遇到illegalstateexception解决办法
    django demo
    Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决方法
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7278501.html
Copyright © 2011-2022 走看看