对约束进行命名

必须对以下约束进行命名。

  • PRIMARY KEY

  • REFERENCES (外键)

  • CHECK

  • UNIQUE

在定义这些约束时对它们进行命名。如果您未分配名称,Vertica 会自动分配名称。

用户分配的约束名称

当您使用 CREATE TABLEALTER TABLE...ADD CONSTRAINT 定义约束时,您可以为约束分配名称。例如,以下 CREATE TABLE 语句分别对主键约束和检查约束 pkdate_c 进行命名:

=> CREATE TABLE public.store_orders_2016
(
    order_no int CONSTRAINT pk PRIMARY KEY,
    product_key int,
    product_version int,
    order_date timestamp NOT NULL,
    shipper varchar(20),
    ship_date date,
    CONSTRAINT date_c CHECK (date_part('year', order_date)::int = 2016)
)
PARTITION BY ((date_part('year', order_date))::int);
CREATE TABLE

以下 ALTER TABLE 语句添加外键约束 fk

=> ALTER TABLE public.store_orders_2016 ADD CONSTRAINT fk
    FOREIGN KEY (product_key, product_version)
    REFERENCES public.product_dimension (product_key, product_version);

自动分配的约束名称

对约束进行命名是可选的。如果您不为约束分配名称,Vertica 将使用以下约定分配自己的名称:

C_constraint-type[_integer]

例如,下表定义了两个名为 ab 列,并将它们限制为仅包含唯一值:

=> CREATE TABLE t1 (a int UNIQUE, b int UNIQUE );
CREATE TABLE

当您使用 EXPORT_TABLES 导出表的 DDL 时,该函数的输出中显示 Vertica 已为 a 列分配约束名称 C_UNIQUE,已为 b 列分配约束名称 C_UNIQUE_1


=> SELECT EXPORT_TABLES('','t1');
CREATE TABLE public.t1
(
    a int,
    b int,
    CONSTRAINT C_UNIQUE UNIQUE (a) DISABLED,
    CONSTRAINT C_UNIQUE_1 UNIQUE (b) DISABLED
);

(1 row)

查看约束名称

您可以通过使用 EXPORT_TABLES 导出表的 DDL 来查看表约束的名称,如前面所示。您还可以查询以下系统表:

例如,以下查询获取 online_sales 架构中所有主键约束和外键约束的名称:

=> SELECT table_name, constraint_name, column_name, constraint_type FROM constraint_columns
     WHERE constraint_type in ('p','f') AND table_schema='online_sales'
     ORDER BY table_name, constraint_type, constraint_name;
      table_name       |      constraint_name      |   column_name   | constraint_type
-----------------------+---------------------------+-----------------+-----------------
 call_center_dimension | C_PRIMARY                 | call_center_key | p
 online_page_dimension | C_PRIMARY                 | online_page_key | p
 online_sales_fact     | fk_online_sales_cc        | call_center_key | f
 online_sales_fact     | fk_online_sales_customer  | customer_key    | f
 online_sales_fact     | fk_online_sales_op        | online_page_key | f
 online_sales_fact     | fk_online_sales_product   | product_version | f
 online_sales_fact     | fk_online_sales_product   | product_key     | f
 online_sales_fact     | fk_online_sales_promotion | promotion_key   | f
 online_sales_fact     | fk_online_sales_saledate  | sale_date_key   | f
 online_sales_fact     | fk_online_sales_shipdate  | ship_date_key   | f
 online_sales_fact     | fk_online_sales_shipping  | shipping_key    | f
 online_sales_fact     | fk_online_sales_warehouse | warehouse_key   | f
(12 rows)

使用约束名称

您必须引用约束名称才能执行以下任务:

  • 启用或禁用约束强制执行。

  • 删除约束。

例如,以下 ALTER TABLE 语句在 store_orders_2016 表中启用对 pk 约束的强制执行:


=> ALTER TABLE public.store_orders_2016 ALTER CONSTRAINT pk ENABLED;
ALTER TABLE

以下语句删除同一个表中的另一个约束:

=> ALTER TABLE public.store_orders_2016 DROP CONSTRAINT date_c;
ALTER TABLE