删除约束

ALTER TABLE 通过两种方式从表中删除约束:

例如,表 store_orders_2018 指定以下约束:

  • 命名约束 pk 将列 order_no 标识为主键。

  • 命名约束 IsYear2018 指定的检查约束在 order_date 列中仅允许使用 2018 年的日期。

  • 命名约束 Ship5dAfterOrder 指定的检查约束禁止使用 order_date 之后 5 天以上的任何 ship_date 值。

  • order_noorder_date 列设置为 NOT NULL

CREATE TABLE public.store_orders_2018 (
    order_no int NOT NULL CONSTRAINT pk PRIMARY KEY,
    product_key int,
    product_version int,
    order_date timestamp NOT NULL,
    shipper varchar(20),
    ship_date date,
    CONSTRAINT IsYear2018 CHECK (DATE_PART('year', order_date)::int = 2018),
    CONSTRAINT Ship5dAfterOrder CHECK (DAYOFYEAR(ship_date) - DAYOFYEAR(order_date) <=5)
);

删除命名约束

您可以使用 ALTER TABLE...DROP CONSTRAINT 移除主键、外键、检查和唯一约束,这需要您提供它们的名称。例如,您按如下方式移除表 store_orders_2018 中的主键约束:

=> ALTER TABLE store_orders_2018 DROP CONSTRAINT pk;
ALTER TABLE
=> SELECT export_tables('','store_orders_2018');
                                                             export_tables
---------------------------------------------------------------------------------------------------------------------------------------

CREATE TABLE public.store_orders_2018
(
    order_no int NOT NULL,
    product_key int,
    product_version int,
    order_date timestamp NOT NULL,
    shipper varchar(20),
    ship_date date,
    CONSTRAINT IsYear2018 CHECK (((date_part('year', store_orders_2018.order_date))::int = 2018)) ENABLED,
    CONSTRAINT Ship5dAfterOrder CHECK (((dayofyear(store_orders_2018.ship_date) - dayofyear(store_orders_2018.order_date)) <= 5)) ENABLED
);

删除 NOT NULL 约束

使用 ALTER TABLE...ALTER COLUMN 删除列的 NOT NULL 约束,如以下示例所示:

=> ALTER TABLE store_orders_2018 ALTER COLUMN order_date DROP NOT NULL;
ALTER TABLE

删除主键

如果某个主键约束被另一个表中的外键约束引用,则不能删除该主键约束。若要删除主键,必须首先删除所有引用它的外键。

删除由约束引用的列

如果您尝试删除由同一表中的约束引用的列,则删除操作会返回错误。例如,检查约束 Ship5dAfterOrder 会引用两列:order_dateship_date。如果您尝试删除其中的任一列,Vertica 会返回以下错误消息:

=> ALTER TABLE public.store_orders_2018 DROP COLUMN ship_date;
ROLLBACK 3128:  DROP failed due to dependencies
DETAIL:
Constraint Ship5dAfterOrder references column ship_date
HINT:  Use DROP .. CASCADE to drop or modify the dependent objects

在这种情况下,您必须使用 CASCADE 选项限定 DROP COLUMN 子句,该选项指定要删除列及其依赖对象 — 在这种情况下,约束 Ship5dAfterOrder

=> ALTER TABLE public.store_orders_2018 DROP COLUMN ship_date CASCADE;
ALTER TABLE

调用 Vertica 函数 EXPORT_TABLES 可确认列和约束是否均已移除:

=> ALTER TABLE public.store_orders_2018 DROP COLUMN ship_date CASCADE;
ALTER TABLE
dbadmin=> SELECT export_tables('','store_orders_2018');
                                              export_tables
---------------------------------------------------------------------------------------------------------

CREATE TABLE public.store_orders_2018
(
    order_no int NOT NULL,
    product_key int,
    product_version int,
    order_date timestamp,
    shipper varchar(20),
    CONSTRAINT IsYear2018 CHECK (((date_part('year', store_orders_2018.order_date))::int = 2018)) ENABLED
);

(1 row)