MySQL CHECK约束功能如何实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43054397/article/details/93020765

CHECK 检查约束

在我们使用 MySQL 插入数据时,假如我们插入性别,就只能插入‘男’、‘女’,或者插入数据控制在一定范围内,我们都会使用 CHECK 检查约束来实现。

问题:

MySQL 所有的存储引擎都不支持 CHECK 约束,MySQL中可以写 CHECK 约束,但会忽略它的作用,因此 CHECK 并不起作用,因此实现对数据约束有两种方法:

  • 在 MySQL 种约束,如使用 ENUM 类型 或者 触发器
  • 在应用程序里面对数据进行检查再插入。

在这里我们主要解释第一种的 ENUM 类型或者触发器如何实现 CHECK约束作用;

ENUM 控制选项:

具体用法讲解可参考 MySQl 数据类型 ENUM

CREATE TABLE person(
	id tinyint(4) NOT NULL AUTO_INCREMENT,
    name varchar(16) NOT NULL,
    sex enum('男','女') NOT NULL
	PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO person(name, sex) VALUES('luchi1','男');
INSERT INTO person(name, sex) VALUES('luchi2','女');
INSERT INTO person(name, sex) VALUES('luchi3','中');


如图所示,sex 只能插入男,女;

触发器控制范围:

在这里我们把表加上一个字段年龄

ALTER TABLE person ADD age tinyint(4) NOT NULL;

创建触发器,控制当年龄 <0 或者 >120 时不能插入:

DELIMITER $$
CREATE TRIGGER before_age_insert
BEFORE INSERT
ON person FOR EACH ROW
BEGIN
    IF (NEW.age < 0 OR NEW.age>120) THEN  
        DELETE FROM person WHERE age = NEW.age;    
    END IF;
END$$
DELIMITER ;

测试:

TRUNCATE TABLE person; --清空表
INSERT INTO person(name, sex, age) VALUES('luchi1','男','21');
INSERT INTO person(name, sex, age) VALUES('luchi2','女','121');


会发现当插入数据不符合数据范围时插入不会成功;

猜你喜欢

转载自blog.csdn.net/weixin_43054397/article/details/93020765