CHECK 约束
简介
平凯数据库自 7.1 版本开始支持 CHECK 约束,为了和历史版本兼容,该功能需要开启独立配置项。
CHECK 约束
CHECK 约束用于限制表中某个字段的值必须满足指定条件。当为表添加 CHECK 约束后,在插入或者更新表的数据时,数据库会检查约束条件是否满足,如果不满足,则会报错。 数据库中 CHECK 约束的语法如下,与 MySQL 中一致:
[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
语法说明:
[]中的内容表示可选项。CONSTRAINT [symbol]表示CHECK约束的名称。CHECK (expr)表示约束条件,其中 expr 需要为一个布尔表达式。对于表中的每一行,该表达式的计算结果必须为 TRUE、FALSE 或 UNKNOWN (对于 NULL 值) 中的一个。对于某行数据,如果该表达式计算结果为 FALSE,则表示违反约束条件。[NOT] ENFORCED表示是否执行约束,可以用于启用或者禁用CHECK约束。
添加 CHECK 约束
在平凯数据库中,你可以在 CREATE TABLE 或者 ALTER TABLE 语句中为表添加 CHECK 约束。
在
CREATE TABLE语句中添加CHECK约束的示例:CREATE TABLE t(a INT CHECK(a > 10) NOT ENFORCED, b INT, c INT, CONSTRAINT c1 CHECK (b > c));在
ALTER TABLE语句中添加CHECK约束的示例:ALTER TABLE t ADD CONSTRAINT CHECK (1 < c);
在添加或者启用 CHECK 约束时,数据库会对表中的存量数据进行校验。如果存在违反约束的数据,添加 CHECK 约束操作将失败并且报错。
在添加 CHECK 约束时,可以指定约束名,也可以不指定约束名。如果不指定约束名,那么数据库会自动生成一个格式为 <tableName>_chk_<1, 2, 3...> 的约束名。
查看 CHECK 约束
你可以通过 SHOW CREATE TABLE 查看表中的约束信息。例如:
SHOW CREATE TABLE t;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t | CREATE TABLE `t` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
CONSTRAINT `c1` CHECK ((`b` > `c`)),
CONSTRAINT `t_chk_1` CHECK ((`a` > 10)) /*!80016 NOT ENFORCED */,
CONSTRAINT `t_chk_2` CHECK ((1 < `c`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
删除 CHECK 约束
删除 CHECK 约束时,你需要指定需要删除的约束名。例如:
ALTER TABLE t DROP CONSTRAINT t_chk_1;
启用或禁用 CHECK 约束
在为表添加 CHECK 约束的时候,可以指定当插入或者更新数据时平凯数据库是否执行约束检查。
- 如果指定了
NOT ENFORCED,当插入或者更新数据时,平凯数据库不会检查约束条件。 - 如果未指定
NOT ENFORCED或者指定了ENFORCED,当插入或者更新数据时,平凯数据库会检查约束条件。
除了在添加约束时候指定 [NOT] ENFORCED,你还可以在 ALTER TABLE 语句中启用或者禁用 CHECK 约束。例如:
ALTER TABLE t ALTER CONSTRAINT c1 NOT ENFORCED;
与 MySQL 的兼容性
- 不支持在添加列的同时添加
CHECK约束(例如,ALTER TABLE t ADD COLUMN a CHECK(a > 0)),否则只有列会被添加成功,平凯数据库会忽略CHECK约束但不会报错。 - 不支持使用
ALTER TABLE t CHANGE a b int CHECK(b > 0)添加CHECK约束,使用该语句时平凯数据库会报错。