📢CHECK约束
✨CHECK约束用于在插入或更新数据时对列值进行条件检查。它允许你定义一个条件,确保将要插入或更新的数据满足特定的要求。如果数据不符合条件,数据库将拒绝插入或更新操作,并返回错误。
✨ 这种约束可以用于确保数据的完整性和一致性,以及执行业务规则。例如,你可以使用CHECK约束来确保年龄字段的值在合理的范围内,或者确保日期字段的值在特定的时间范围内。
总的来说,CHECK约束有以下作用:
1.数据完整性:确保数据符合预期的条件,避免插入无效或不合理的数据。
2.业务规则执行:允许数据库强制执行特定的业务规则,确保数据满足特定的要求。
3.数据一致性:帮助维护数据的一致性,避免出现不符合逻辑的数据情况。
✨ 通过使用CHECK约束,你可以在数据库层面上实施对数据的限制,从而减少错误数据的插入,提高数据质量,以及确保数据库中存储的数据符合特定的标准和要求。
📢那么会遇到什么问题呢?
✨例如下面的这条语句
create table user ( id int primary key auto_increment comment 'ID唯一标识', name varchar(10) not null unique comment '姓名' , age int check (age > 0 && age <=120) comment '年龄', status char(1) default '1' comment '状态' , gender char(1) comment '性别' ) comment '用户表' ;
✨最后给我的一个执行结果是:
✨ 报错的意思大致是:你有一个错误在你的SQL语法;查看与你的MySQL服务器版本对应的手册,以便在“comment”附近使用正确的语法。其实大致就是说你语法错误了
✨ 于是乎我百思不得其解,反复横看,根本没有看出来哪里有语法错误,之后根据报错去查看了官网的mysql服务器的版本说明才恍然大悟
✨我的 MySQL 语句几乎正确,但有一处需要修改。在 MySQL 中,CHECK 约束用于定义列级别的条件,但是 MySQL 不会实际执行它们。因此,在我的语句中,CHECK 约束不会生效。
✨注意,我的MySQL不支持 CHECK 约束,因为我的MySQL的版本是8.0.12,MySQL 5.7版本及之前是不支持CHECK约束的。从MySQL 8.0.16版本开始,MySQL才开始支持CHECK约束。因此,如果你使用的是MySQL 8.0.16或更高版本,你可以使用CHECK约束来实现列级别的条件检查。所有低版本的我如果想要限制 age 的取值范围,只能去使用触发器或应用层面的验证。但是其他方面的语句都是正确的。
📢那么关于如何使用CHECK约束进行检查,以下是一个简单的演示:
✨首先,我们创建一个表,并添加CHECK约束来检查年龄是否在1到120之间:
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID唯一标识', name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名', age INT COMMENT '年龄', status CHAR(1) DEFAULT '1' COMMENT '状态', gender CHAR(1) COMMENT '性别', CONSTRAINT check_age CHECK (age > 0 AND age <= 120) ) COMMENT '用户表';
解释说明:
在这个示例中,CONSTRAINT check_age CHECK (age > 0 AND age <= 120) 是用来创建名为 "check_age" 的 CHECK 约束。这个约束确保了在插入或更新数据时,age 列的值必须大于 0 并且小于等于 120。
现在来解释一下 CONSTRAINT。在上面的示例中,CONSTRAINT check_age 表示我们正在定义一个约束,并将其命名为 "check_age"。关键字 CONSTRAINT 用于指定约束的名称,它可以是任何合法的标识符。然后,我们使用 CHECK 关键字来定义实际的检查条件,以确保满足特定的要求。
如果你想要添加多个约束,你可以使用逗号分隔它们。例如:
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID唯一标识', name VARCHAR(10) NOT NULL UNIQUE COMMENT '姓名', age INT COMMENT '年龄', status CHAR(1) DEFAULT '1' COMMENT '状态', gender CHAR(1) COMMENT '性别', CONSTRAINT check_age CHECK (age > 0 AND age <= 120), CONSTRAINT check_status CHECK (status IN ('1', '2')) ) COMMENT '用户表';
在这个例子中,我们定义了两个约束一个用于检查年龄,另一个用于检查状态列的值是否为 '1' 或 '2'。
执行如下:
✨此时一个带有以上字段的表已经建立
✨然后,我们尝试插入一些数据:
-- 插入年龄符合条件的数据 INSERT INTO user (name, age, status, gender) VALUES ('张三', 25, '1', 'M'); -- 尝试插入年龄不符合条件的数据 INSERT INTO user (name, age, status, gender) VALUES ('李四', 150, '1', 'M');
执行的第一个语句:
✨此时我们发现,符合条件的数据张三已经插入
执行第二个语句:
✨此时提示我们年龄范围要在between 1 and 120,也就是数为包含1和120,且之间
✨不过实际上在MySQL 8.0.16版本之前,MySQL并不会执行CHECK约束。因此,即使你定义了CHECK约束,MySQL也不会对其进行验证,这意味着CHECK约束将不会生效。
✨如果你想要确保数据满足特定的条件,可以考虑使用触发器(trigger)来实现类似的功能。通过创建触发器,你可以在插入或更新数据时执行自定义的逻辑,包括条件检查。
✨以下是一个简单的示例,演示如何使用触发器来模拟CHECK约束的行为:
DELIMITER // CREATE TRIGGER check_age_before_insert BEFORE INSERT ON user FOR EACH ROW BEGIN IF NEW.age <= 0 OR NEW.age > 120 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Age must be between 1 and 120'; END IF; END; // DELIMITER ;
✨在这个示例中,我们创建了一个名为 check_age_before_insert 的触发器,在每次向 user 表中插入新数据之前都会执行。如果年龄不符合条件,则会产生一个信号(SIGNAL),并返回一条错误消息。
✨通过使用触发器,你可以实现类似于CHECK约束的行为,并在需要时执行自定义的条件检查逻辑。