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] | 约束名称。如没有显式设置名称,系统会自动生成 |
CHECK (expr) | 约束条件。其中 |
[NOT] ENFORCED | 开启或关闭CHECK约束。 |
添加CHECK约束
在PolarDB-X中,CREATE TABLE
、ALTER 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;