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 约束,使用该语句时平凯数据库会报错。