删除约束
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)