ADD CONTRAINT语句可以为列添加以下约束:

主键的Not Null约束只能通过CREATE TABLE创建。Default约束通过ALTER COLUMN管理。

概要

图片

所需权限

用户需要有表的CREATE权限

参数

Parameter Description
table_name 需添加约束的列所在的表
constraint_name 约束名,必须在表内唯一,并且符合命名规范.
constraint_elem 要添加的约束: Check, Foreign Keys, Unique

通过 ALTER COLUMN添加或修改一个默认约束。

修改表的主键无法通过ALTER TABLE完成,只能在表格创建时指定。

查看Schema变更

每当你操作表scheme变更时,CockroachDB都会将它注册为一个Job,你可以通过SHOW JOBS查看。

举例

添加约束:Unique

添加Unique约束要求该列的每一个值都是唯一的,NULL除外;

> ALTER TABLE orders ADD CONSTRAINT id_customer_unique UNIQUE (id, customer);

添加约束:Check

添加Check约束,要求所有列的值通过布尔表达式计算后为True

> ALTER TABLE orders ADD CONSTRAINT total_0_check CHECK (total > 0);

通过 CASCADE添加Foreign Key约束

在添加Foreign Key约束前,该列必须已添加索引。如果该列未索引,使用CREATE INDEX来创建索引,然后再通过ADD CONSTRAINT添加Foreign Key约束。

举个例子,假设现在有两个表: orderscustomers:

> SHOW CREATE TABLE customers;
+-----------+-------------------------------------------------+
|   Table   |                   CreateTable                   |
+-----------+-------------------------------------------------+
| customers | CREATE TABLE customers (␤                       |
|           |     id INT NOT NULL,␤                           |
|           |     "name" STRING NOT NULL,␤                    |
|           |     address STRING NULL,␤                       |
|           |     CONSTRAINT "primary" PRIMARY KEY (id ASC),␤ |
|           |     FAMILY "primary" (id, "name", address)␤     |
|           | )                                               |
+-----------+-------------------------------------------------+
(1 row)
> SHOW CREATE TABLE orders;
+--------+-------------------------------------------------------------------------------------------------------------+
| Table  |                                                 CreateTable                                                 |
+--------+-------------------------------------------------------------------------------------------------------------+
| orders | CREATE TABLE orders (␤                                                                                      |
|        |     id INT NOT NULL,␤                                                                                       |
|        |     customer_id INT NULL,␤                                                                                  |
|        |     status STRING NOT NULL,␤                                                                                |
|        |     CONSTRAINT "primary" PRIMARY KEY (id ASC),␤                                                             |
|        |     FAMILY "primary" (id, customer_id, status),␤                                                            |
|        |     CONSTRAINT check_status CHECK (status IN ('open':::STRING, 'complete':::STRING, 'cancelled':::STRING))␤ |
|        | )                                                                                                           |
+--------+-------------------------------------------------------------------------------------------------------------+
(1 row)

要确保orders.customer_id列中的每个值与customers.id列中的唯一值匹配,您需要将外键约束添加到orders.customer_id。 所以你首先需要在orders.customer_id上创建一个索引:

> CREATE INDEX ON orders (customer_id);

然后再添加Foreign Key约束。

New in v2.0:你可以指定一个foreign key action来指定当foreign key被更新或删除的时候执行什么动作。在下述例子中,我们可以使用ON DELETE CASCADE来添加(当相关行被删除,所有依赖的对象也会被删除)

CASCADE不会列出它删除或者更新的对象,所以需要谨慎使用

> ALTER TABLE orders ADD CONSTRAINT customer_fk FOREIGN KEY (customer_id) REFERENCES customers (id) ON DELETE CASCADE;

如果你在创建索引前添加约束,将会报错如下:

pq: foreign key requires an existing index on columns ("customer_id")

See Also