帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】Mysql中的CHECK约束特性详解

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio

功能说明

在MySQL 8.0.16以前, CREATE TABLE允许从语法层面输入下列CHECK约束,但实际没有效果:

约束表达式在不同的SQL模式下,可能返回不同的结果

另外,在INFORMATION_SCHEMA的CHECK_CONSTRAINTS表中存放着所有表中定义的CHECK约束的信息。

建议使用CHECK约束的场景

复杂业务场景下的约束,从架构角度看,允许有不同的实现方式:

放在数据库表中,通过约束实现,但不支持子查询

放在数据库中,通过触发器(TRIGGER)实现

放在应用程序的逻辑中,在提前数据库前检查

一般性的,选择不同方式的原则如下:

如果CHECK约束可以实现,且约束比较稳定,一般用CHECK约束实现,比如:年龄不允许为负数,不允许>150等,比如:


CREATE TABLE Departments (
    ID int NOT NULL,
    PID int NOT NULL,
    Name varchar(255) NOT NULL Default ”,
    CHECK (ID>=1)
);
— add check separately
ALTER TABLE Departments
ADD CONSTRAINT CHK_PID CHECK (ID>=1 AND PID >=0);
— remove check
ALTER TABLE Departments
DROP CHECK CHK_PID;

如果属于数据库逻辑,比如:审计,外键可以使用触发器


CREATE TABLE IF NOT EXISTS `department` (
  `id` int NOT NULL AUTO_INCREMENT,
  `pid` int COMMENT ‘parent id’,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE = InnoDB;

CREATE TRIGGER pid_insert_check 
BEFORE INSERT ON department 
FOR EACH ROW 
BEGIN
  IF (NEW.pid <> 0 AND NEW.pid NOT IN (select id from department)) THEN
    signal sqlstate ‘45000’
    set message_text = ‘department parent id has to be chosen from id’;
  END IF;
END

CREATE TRIGGER pid_delete_check 
BEFORE DELETE ON department 
FOR EACH ROW 
BEGIN
  IF (OLD.id < 0 OR OLD.id IN (select pid from department)) THEN
    signal sqlstate ‘45000’
    set message_text = ‘department parent id has to be chosen from id’;
  END IF;
END

如果属于业务逻辑,建议放在应用层处理,方便开发者:理解和维护,但是:也需要通过强化业务管理,避免特权用户偶发操作引起对数据完整性的破坏

到此这篇关于Mysql中的CHECK约束特性详解的文章就介绍到这了,更多相关Mysql中CHECK约束内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


联系我们
返回顶部