约束强制执行级别
可以在两个级别强制执行约束:
-
[表约束](#Table Co)
约束强制执行参数
Vertica 支持通过以下三个布尔参数来强制执行约束:
表约束强制执行
可以通过使用关键字 ENABLED
或 DISABLED
限定约束,借助于
CREATE TABLE
和
ALTER TABLE
对表设置约束强制执行。以下 CREATE TABLE
语句在其 order_qty
列的定义中对检查约束启用强制执行:
=> CREATE TABLE new_orders (
cust_id int,
order_date timestamp DEFAULT CURRENT_TIMESTAMP,
product_id varchar(12),
order_qty int CHECK(order_qty > 0) ENABLED,
PRIMARY KEY(cust_id, order_date) ENABLED
);
CREATE TABLE
ALTER TABLE
可以对现有约束启用强制执行。以下语句通过对指定的约束 C_UNIQUE
启用强制执行来修改表 customer_dimension
:
=> ALTER TABLE public.customer_dimension ALTER CONSTRAINT C_UNIQUE ENABLED;
ALTER TABLE
强制执行级别优先级
表和列的强制执行设置优先于强制执行参数设置。如果表或列约束省略 ENABLED
或 DISABLED
,Vertica 将使用相关配置参数的当前设置。
重要
更改约束强制执行参数对省略ENABLED
或 DISABLED
的现有表约束没有影响。这些表约束将保留它们先前获取的强制执行设置。您只能使用
ALTER TABLE...ALTER CONSTRAINT
更改这些约束的强制执行设置。
下面的 CREATE TABLE
语句创建其中包含列 order_id
和 order_qty
的表 new_sales
,这两列分别定义有约束 PRIMARY KEY
和 CHECK
:
=> CREATE TABLE new_sales ( order_id int PRIMARY KEY, order_qty int CHECK (order_qty > 0) );
这两个约束都没有显式启用或禁用,因此 Vertica 使用配置参数 EnableNewPrimaryKeysByDefault
和 EnableNewCheckConstraintsByDefault
在表定义中设置强制执行:
=> SHOW CURRENT EnableNewPrimaryKeysByDefault, EnableNewCheckConstraintsByDefault;
level | name | setting
---------+------------------------------------+---------
DEFAULT | EnableNewPrimaryKeysByDefault | 0
DEFAULT | EnableNewCheckConstraintsByDefault | 1
(2 rows)
=> SELECT EXPORT_TABLES('','new_sales');
...
CREATE TABLE public.new_sales
(
order_id int NOT NULL,
order_qty int,
CONSTRAINT C_PRIMARY PRIMARY KEY (order_id) DISABLED,
CONSTRAINT C_CHECK CHECK ((new_sales.order_qty > 0)) ENABLED
);
(1 row)
在这种情况下,将 EnableNewPrimaryKeysByDefault
更改为 1(启用)对表 new_sales
中的 C_PRIMARY
约束没有影响。可以使用 ALTER TABLE...ALTER CONSTRAINT
强制执行此约束:
=> ALTER TABLE public.new_sales ALTER CONSTRAINT C_PRIMARY ENABLED;
ALTER TABLE