ALTER TABLE ... ENABLE/DISABLE CONSTRAINT命令用于启用或禁用约束。

前提条件

  • shared_preload_libraries参数中添加polar_constraint插件。
  • 内核版本为V1.1.11及以上,升级内核版本,请参见版本管理
  • 手动升级到V1.1.11内核版本的集群需要安装polar_constraint插件,命令如下:
    CREATE EXTENSION IF NOT EXISTS polar_constraint;

语法

  • ALTER TABLE table_name ADD CONSTRAINT constraint_name DISABLE;

    为表table_name添加一个约束,约束constraint_name为禁用状态,即对当前表中的数据和新插入的数据都不起作用。

    目前该语法支持如下四种类型的约束:

    • 主键约束
    • 唯一性约束
    • 外键约束
    • CHECK约束
  • ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

    修改约束为启用状态。默认情况下会检查当前表中的数据是否匹配目标约束,如果不匹配,则输出表中数据有冲突的错误。

    说明 如果是外键约束,并且与另一个表的主键约束或唯一性约束相对应,在启用外键约束前,需要检查当前外键约束关联的主键约束或唯一性约束是否处于启用状态,如果是启用状态则可以正常启用外键约束,反之则报错。
  • ALTER TABLE table_name ENABLE CONSTRAINT constraint_name NOT VALID;

    修改约束为启用状态,但是不检查当前表中的数据是否匹配修改的目标约束。

  • ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

    修改约束为禁用状态。禁用后,约束将不再起作用。

    说明 如果约束是主键约束或唯一性约束,这两类约束可能被其他对象引用。例如主键约束被另一个表的外键约束引用,那么当外键约束没有被禁用或删除的情况下,主键约束无法被禁用的。

示例

创建一个表。

CREATE TABLE aa(a1 INT);
CREATE TABLE

创建一个约束,要求a1列的值必须大于10,约束初始化为禁用状态。

ALTER TABLE aa ADD CONSTRAINT aa_a1_check CHECK(a1>10) DISABLE;
ALTER TABLE

插入一个不符合约束条件的值,由于约束处于禁用状态,可以正常插入。

INSERT INTO aa VALUES (10);
INSERT 0 1

启用约束并检查现有数据是否符合约束,由于表中存在不符合约束条件的数据,故产生报错。

ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check;
ERROR:  check constraint "aa_a1_check" is violated by some row

启用约束不检查现有数据是否符合约束。

ALTER TABLE aa ENABLE CONSTRAINT aa_a1_check NOT VALID;
ALTER TABLE

插入不符合约束条件的数据,产生报错。

INSERT INTO aa VALUES (10);
ERROR:  new row for relation "aa" violates check constraint "aa_a1_check"
DETAIL:  Failing row contains (10).