删除约束
ALTER TABLE 通过两种方式从表中删除约束:
-
ALTER TABLE...DROP CONSTRAINT移除命名表的约束。 -
ALTER TABLE...ALTER COLUMN移除列的NOT NULL约束。
例如,表 store_orders_2018 指定以下约束:
-
命名约束
pk将列order_no标识为主键。 -
命名约束
IsYear2018指定的检查约束在order_date列中仅允许使用 2018 年的日期。 -
命名约束
Ship5dAfterOrder指定的检查约束禁止使用order_date之后 5 天以上的任何ship_date值。 -
order_no和order_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_date 和 ship_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)