全部产品
Search
文档中心

云原生数据库 PolarDB:CHECK约束

更新时间:Jan 07, 2025

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

版本限制

实例版本需为polardb-2.5.0_5.4.20-20241224_xcluster8.4.20-20241213及以上。

说明

CHECK约束语法

[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约束

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\G
           Table: t1
    Create Table: 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约束时,不会对表中的存量数据进行校验。

    • 当DN版本为MySQL 5.7时,执行含有CHECK约束的SQL时不会报错,但其功能会被忽略。

    • 当DN版本为MySQL 8.0时,CHECK约束拥有完整的功能。

删除CHECK约束

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

ALTER TABLE t1 DROP CONSTRAINT t1_chk_1;

开启或关闭CHECK约束

在为表添加CHECK约束时,可以指定是否启用约束检查。

  • 如果指定了NOT ENFORCED,插入或更新数据时则不会检查约束条件,示例如下:

    ALTER TABLE t1 ADD CHECK c4_c1_not_equal (c4 <> c1) NOT ENFORCED;
  • 如果未指定NOT ENFORCED或者指定了ENFORCED,插入或更新数据时就会检查约束条件。

除了在建表时添加约束指定[NOT] ENFORCED,还可以通过ALTER TABLE语句调整是否启用CHECK约束,示例如下:

ALTER TABLE t1 ALTER CONSTRAINT c1_nonzero NOT ENFORCED;