文档下载建议反馈入口

  • 添加约束
  • 查看约束
  • 重命名约束
  • 删除约束

约束管理

添加约束

ADD CONSTRAINT 语句是 ALTER TABLE 语句的一部分,用于为列添加唯一性(UNIQUE)约束、检查(CHECK)约束、外键(FOREIGN KEY)约束。

说明

  • KaiwuDB 支持使用 ALTER COLUMN 语句添加、修改默认约束。
  • KaiwuDB 不支持使用 ALTER TABLE 语句添加主键约束,只支持在创建表时指定主键约束。

前提条件

  • 非三权分立模式下,用户拥有目标表的 CREATE 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有目标表 CREATE 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

ALTER TABLE [IF EXISTS] <table_name> ADD CONSTRAINT <constraint_name> <constraint_elem> [NOT VALID];

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标表存在,系统添加约束。如果目标表不存在,系统添加约束失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标表存在,系统添加约束。如果目标表不存在,系统报错,提示目标表不存在。
table_name待添加约束的列所在的表。
constraint_name约束名。该名称在表中必须唯一,并且遵循数据库标识符规则
constraint_elem待添加的约束,支持以下约束:
- CHECK:列值满足指定的条件或表达式。
- UNIQUE:列值都唯一,NULL 值除外。
- FOREIGN KEY:在为列添加外键约束前,该列必须已创建索引。如未创建,先使用 CREATE INDEX 语句创建索引,然后再添加外键约束。
NOT VALID创建未验证的约束。创建未验证约束时,系统不会检查现有表数据是否满足约束条件。修改表数据时,系统会执行该约束。

语法示例

  • 添加唯一性约束。

    以下示例为 orders 表的 id 列添加一个名为 id_unique 的唯一性约束。

    ALTER TABLE orders ADD CONSTRAINT id_unique UNIQUE (id);
    ALTER TABLE
    
  • 添加检查约束。

    以下示例为 orders 表的 date 列添加一个名为 date_unique 的检查约束。

    ALTER TABLE orders ADD CONSTRAINT date_check CHECK (date > '2020-01-01') NOT VALID;
    ALTER TABLE
    
  • 添加外键约束。

    以下示例创建 office_dogsaddress 表,且 office_dogs.address_id 列的每个值与 address.id 列中的唯一值匹配。以下示例还为 office_dogs 表的 address_id 列创建外键约束。

    -- 1. 查看已创建的 office_dogs 表。
    
    SHOW CREATE TABLE office_dogs;
      table_name  |                                            create_statement                                              
    --------------+---------------------------------------------------------------------------------------------------------+
      office_dogs | CREATE TABLE office_dogs (                                                                               
                  |     id INT8 NOT NULL,                                                                                    
                  |     last_name STRING NULL,                                                                               
                  |     full_name STRING NULL,                                                                               
                  |     alive STRING NULL,                                                                                   
                  |     rides_id UUID NULL,                                                                                  
                  |     rides_length interval NULL,                                                                          
                  |     rides_city STRING NULL,                                                                              
                  |     address_id UUID NULL,                                                                                
                  |     CONSTRAINT "primary" PRIMARY KEY (id ASC),                                                           
                  |     UNIQUE INDEX id_customer_unique (id ASC, full_name ASC),                                             
                  |     INDEX office_dogs_rides_id_idx (rides_id ASC),                                                       
                  |     INDEX office_dogs_rides_length_rides_city_idx (rides_length ASC, rides_city ASC),                    
                  |     FAMILY "primary" (id, last_name, full_name, alive, rides_id, rides_length, rides_city, address_id),  
                  |     CONSTRAINT alive_check CHECK (alive = 'true') ENABLE                                                 
                  | )                                                                                                        
    (1 row)
    
    -- 2. 查看已创建的 address 表。
    
    SHOW CREATE TABLE address;
      table_name |                create_statement                 
    -------------+------------------------------------------------+
      address    | CREATE TABLE address (                          
                |     id UUID NOT NULL,                           
                |     city STRING NOT NULL,                       
                |     CONSTRAINT "primary" PRIMARY KEY (id ASC),  
                |     FAMILY "primary" (id, city)                 
                | )                                               
    (1 row)
    
    -- 3. 在 `office_dogs.address_id` 上创建索引:
    
    CREATE INDEX ON office_dogs (address_id);
    
    -- 4. 为 office_dogs 表的 address_id 创建外键约束,使用 ON DELETE CASCADE 语句表示当相关行被删除,所有依赖的对象也会被删除。
    
    ALTER TABLE office_dogs ADD CONSTRAINT address_fk FOREIGN KEY (address_id) REFERENCES address (id) ON DELETE CASCADE;
    ALTER TABLE
    
    -- 5. 查看 office_dogs 表的约束。
    
    SHOW CONSTRAINTS FROM office_dogs ;
      table_name  |  CONSTRAINT_name   | CONSTRAINT_type |                              details                               | validated  
    --------------+--------------------+-----------------+--------------------------------------------------------------------+-----------+
      office_dogs | address_fk         | FOREIGN KEY     | FOREIGN KEY (address_id) REFERENCES address (id) ON DELETE CASCADE |   false    
      office_dogs | alive_check        | CHECK           | CHECK (alive = 'true') ENABLE                                      |   true     
      office_dogs | id_customer_unique | UNIQUE          | UNIQUE (id ASC, full_name ASC)                                     |   true     
      office_dogs | primary            | PRIMARY KEY     | PRIMARY KEY (id ASC)                                               |   true     
    (4 rows)
    

查看约束

SHOW CONSTRAINT 语句用于查看表的约束信息。

前提条件

用户拥有对应表的任意权限。

语法格式

SHOW [CONSTRAINT| CONSTRAINTS] FROM <table_name>;

参数说明

参数说明
table_name约束所在的表。

返回字段说明

字段说明
table_name表名。
constraint_name约束名。
constraint_type约束类型。
details约束的定义,包括约束适用的列。
validated列值是否符合约束。

语法示例

以下示例查看 orders 表的约束。

SHOW CONSTRAINTS FROM orders;

执行成功后,控制台输出以下信息:

  table_name |    constraint_name     | constraint_type |                                               details                                                | validated
-------------+------------------------+-----------------+------------------------------------------------------------------------------------------------------+------------
  orders     | check_priority         | CHECK           | CHECK ((priority BETWEEN 1 AND 5))                                                                   |   true
  orders     | check_status           | CHECK           | CHECK ((status IN ('open':::STRING, 'in progress':::STRING, 'done':::STRING, 'cancelled':::STRING))) |   true
  orders     | date_check             | CHECK           | CHECK ((date > '2020-01-01'))                                                                        |   false
  orders     | id_unique              | UNIQUE          | UNIQUE (id ASC)                                                                                      |   true
  orders     | orders_customer_id_key | UNIQUE          | UNIQUE (customer_id ASC)                                                                             |   true
  orders     | primary                | PRIMARY KEY     | PRIMARY KEY (id ASC)                                                                                 |   true
(6 rows)

重命名约束

RENAME CONSTRAINT 语句是 ALTER TABLE 语句的一部分,用于更改约束的名称。

前提条件

  • 非三权分立模式下,用户拥有目标表的 CREATE 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有目标表 CREATE 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

ALTER TABLE [IF EXISTS] <table_name> RENAME CONSTRAINT <current_name> TO <name>;

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标约束存在,系统重命名约束。如果目标约束不存在,系统重命名约束失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标约束存在,系统重命名约束。如果目标约束不存在,系统报错,提示目标表不存在。
table_name待重命名约束的列所在的表。
current_name当前的约束名称。该名称在表中必须唯一,并且遵循数据库标识符规则
name新的约束名称。该名称在表中必须唯一,并且遵循数据库标识符规则

语法示例

以下示例将 orders 表的 orders_customer_id_key 约束重命名为 orders_customer_id_key_rename

-- 1. 将 orders 表的 orders_customer_id_key 约束 重命名为 orders_customer_id_key_rename。

ALTER TABLE orders RENAME CONSTRAINT orders_customer_id_key TO orders_customer_id_key_rename;
ALTER TABLE

-- 2. 查看 orders 表的约束。

SHOW CONSTRAINTS FROM orders;
  table_name |        constraint_name        | constraint_type |                                               details                                                | validated
-------------+-------------------------------+-----------------+------------------------------------------------------------------------------------------------------+------------
  orders     | check_priority                | CHECK           | CHECK ((priority BETWEEN 1 AND 5))                                                                   |   true
  orders     | check_status                  | CHECK           | CHECK ((status IN ('open':::STRING, 'in progress':::STRING, 'done':::STRING, 'cancelled':::STRING))) |   true
  orders     | date_check                    | CHECK           | CHECK ((date > '2020-01-01'))                                                                        |   false
  orders     | id_unique                     | UNIQUE          | UNIQUE (id ASC)                                                                                      |   true
  orders     | orders_customer_id_key_rename | UNIQUE          | UNIQUE (customer_id ASC)                                                                             |   true
  orders     | primary                       | PRIMARY KEY     | PRIMARY KEY (id ASC)                                                                                 |   true
(6 rows)

删除约束

DROP CONSTRAINT 语句是 ALTER TABLE 语句的一部分,用于删除检查约束和外键约束。

前提条件

  • 非三权分立模式下,用户拥有目标表的 CREATE 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有目标表 CREATE 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

ALTER TABLE [IF EXISTS] <table_name> DROP CONSTRAINT [IF EXISTS] name [CASCADE | RESTRICT];

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标约束存在,系统删除目标约束。如果目标约束不存在,系统删除目标约束失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标约束存在,系统删除目标约束。如果目标约束不存在,系统报错,提示目标约束不存在。
table_name待删除约束所在表的名称。
name待删除约束的名称。
CASCADE可选关键字。删除目标约束及其关联对象。CASCADE 不会列出待删除的关联对象,应谨慎使用。
RESTRICT默认设置,可选关键字。如果其他对象依赖目标约束,则无法删除该约束。

语法示例

以下示例删除 orders 表的 check_status 约束。

-- 1. 查看 orders 表的约束。

SHOW CONSTRAINTS FROM orders;
  table_name |        constraint_name        | constraint_type |                                               details                                                | validated
-------------+-------------------------------+-----------------+------------------------------------------------------------------------------------------------------+------------
  orders     | check_priority                | CHECK           | CHECK ((priority BETWEEN 1 AND 5))                                                                   |   true
  orders     | check_status                  | CHECK           | CHECK ((status IN ('open':::STRING, 'in progress':::STRING, 'done':::STRING, 'cancelled':::STRING))) |   true
  orders     | date_check                    | CHECK           | CHECK ((date > '2020-01-01'))                                                                        |   false
  orders     | orders_customer_id_key_rename | UNIQUE          | UNIQUE (customer_id ASC)                                                                             |   true
  orders     | primary                       | PRIMARY KEY     | PRIMARY KEY (id ASC)                                                                                 |   true
(5 rows)

-- 2. 删除 orders 表的 check_status 约束。

ALTER TABLE orders DROP CONSTRAINT check_status;
ALTER TABLE

-- 3. 查看 orders 表的约束。

SHOW CONSTRAINTS FROM orders;
  table_name |        constraint_name        | constraint_type |              details               | validated
-------------+-------------------------------+-----------------+------------------------------------+------------
  orders     | check_priority                | CHECK           | CHECK ((priority BETWEEN 1 AND 5)) |   true
  orders     | date_check                    | CHECK           | CHECK ((date > '2020-01-01'))      |   false
  orders     | orders_customer_id_key_rename | UNIQUE          | UNIQUE (customer_id ASC)           |   true
  orders     | primary                       | PRIMARY KEY     | PRIMARY KEY (id ASC)               |   true
(4 rows)