欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

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

发布时间:2025/7/14 数据库 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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

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

  • 如果需要设置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$$

    转载于:https://www.cnblogs.com/nyist-xsk/p/7278501.html

    总结

    以上是生活随笔为你收集整理的MySQL关于check约束无效的解决办法的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。