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$$

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7278501.html
Copyright © 2011-2022 走看看