CHECK约束

CHECK约束用于限制表中某个字段的值必须满足指定条件。当为表添加CHECK约束后,在插入或者更新表的数据时会检查约束条件是否满足,只有满足约束条件才能完成操作。

版本限制

引擎版本需为MySQL 8.0,且实例版本为polardb-2.5.0_5.4.20-20241224_xcluster8.4.20-20241213及以上。

说明

语法

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
说明

CHECK约束语法与MySQL官方语法一致。更多信息,请参见CHECK Constraints

参数说明:

参数名称

说明

CONSTRAINT [symbol]

约束名称。如没有显式设置名称,系统会自动生成TableName_chk_(1,2,3...)格式的名称。

CHECK (expr)

约束条件。其中expr为布尔表达式,对于表中的每一行,该表达式的计算结果必须为TRUEFALSEUNKNOWN(列值为NULL时)中的一个。对于某行数据,当该表达式计算结果为FALSEUNKNOWN,表示违反约束条件。

[NOT] ENFORCED

控制CHECK约束是否生效。不指定该参数时,CHECK约束是默认生效的。

示例

添加CHECK约束

PolarDB-X中,CREATE TABLEALTER TABLE语句中都支持添加CHECK约束,且表和列都支持添加约束。

重要
  • 表级约束:不出现在任何列定义内,可以引用表中的任何一个或多个列作为约束条件。

  • 列级约束:出现在列定义内,且只能引用该列作为约束条件。

  • CREATE TABLE语句中添加CHECK约束,示例如下:

    CREATE TABLE t1
    (
      CHECK (c1 <> c2), -- 表级约束
      c1 INT CHECK (c1 > 10), -- 列级约束
      c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
      c3 INT CHECK (c3 < 100),
      CONSTRAINT c1_nonzero CHECK (c1 <> 0),
      CHECK (c1 > c3)
    );
  • ALTER TABLE语句中添加CHECK约束,示例如下:

    -- 列级约束
    ALTER TABLE t1 ADD COLUMN c4 INT CHECK (c4 > 0);
    
    -- 表级约束
    ALTER TABLE t1 ADD CHECK (c4 < c3);
    ALTER TABLE t1 ADD CONSTRAINT `c4_maximize` CHECK (c4 < 20);
  • 查看添加的CHECK约束:

    SHOW CREATE TABLE t1;

    返回结果如下:

    CREATE TABLE `t1` (
    	`c1` int DEFAULT NULL,
    	`c2` int DEFAULT NULL,
    	`c3` int DEFAULT NULL,
    	`c4` int DEFAULT NULL,
    	CONSTRAINT `c1_nonzero` CHECK (`c1` <> 0),
    	CONSTRAINT `c2_positive` CHECK (`c2` > 0),
    	CONSTRAINT `c4_maximize` CHECK (`c4` < 20),
    	CONSTRAINT `t1_chk_1` CHECK (`c1` <> `c2`),
    	CONSTRAINT `t1_chk_2` CHECK (`c1` > 10),
    	CONSTRAINT `t1_chk_3` CHECK (`c3` < 100),
    	CONSTRAINT `t1_chk_4` CHECK (`c1` > `c3`),
    	CONSTRAINT `t1_chk_5` CHECK (`c4` > 0),
    	CONSTRAINT `t1_chk_6` CHECK (`c4` < `c3`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci

CHECK约束的生效与失效

  • 如果指定了NOT ENFORCED,则约束不生效,即插入或更新数据时也不会按照约束条件检查相关数据。

    ALTER TABLE t1 ADD CHECK c4_c1_not_equal (c4 <> c1) NOT ENFORCED;
  • 如果未指定NOT ENFORCED或指定为ENFORCED,则按照约束条件检查插入和更新的数据,存量数据如果不涉及更新操作则不会再检查。

  • 通过ALTER TABLE调整已有CHECK约束是否生效。

    ALTER TABLE t1 ALTER CONSTRAINT c1_nonzero NOT ENFORCED;

删除CHECK约束

删除CHECK约束时,需要指定需要删除的约束名,示例如下:

ALTER TABLE t1 DROP CONSTRAINT t1_chk_1;