主键约束
主键包含一列或多列基元类型,其值可以唯一标识表行。一个表只能指定一个主键。您可以在创建表时或在现有表中使用
ALTER TABLE
标识表的主键。您不能将具有集合类型的列指定为键。
例如,下面的 CREATE TABLE
语句将 order_no
列定义为 store_orders
表的主键:
=> CREATE TABLE public.store_orders(
order_no int PRIMARY KEY,
order_date timestamp NOT NULL,
shipper varchar(20),
ship_date date,
product_key int,
product_version int
)
PARTITION BY ((date_part('year', order_date))::int);
CREATE TABLE
多列主键
一个主键可以包含多列。在这种情况下,CREATE TABLE
语句必须在定义所有列之后指定约束,如下所示:
=> CREATE TABLE public.product_dimension(
product_key int,
product_version int,
product_description varchar(128),
sku_number char(32) UNIQUE,
category_description char(32),
CONSTRAINT pk PRIMARY KEY (product_key, product_version) ENABLED
);
CREATE TABLE
或者,您可以使用单独的
ALTER TABLE...ADD CONSTRAINT
语句指定表的主键,如下所示:
=> ALTER TABLE product_dimension ADD CONSTRAINT pk PRIMARY KEY (product_key, product_version) ENABLED;
ALTER TABLE
强制执行主键
您可以通过强制执行主键约束来防止将重复值加载到主键中。这样做可以让您在主键和外键上联接表。当查询将维度表联接到事实表时,维度表中的每个主键都必须唯一地匹配事实表中的每个外键值。否则,尝试联接这些表会返回键强制执行错误。
您可以使用配置参数 EnableNewPrimaryKeysByDefault
全局强制执行主键约束。还可以通过使用关键字 ENABLED
限定约束来对特定表强制执行主键约束约束。在这两种情况下,Vertica 都会在将键值加载到表中时检查键值,并在有任何约束违规时返回错误。或者,在更新表内容后使用
ANALYZE_CONSTRAINTS
验证主键。有关详细信息,请参阅约束强制执行。
提示
请考虑对主键列使用序列以保证唯一性,并避免主键约束可能产生的资源开销。在主键上设置 NOT NULL
在定义主键时,Vertica 会自动将主键列设置为 NOT NULL
。例如,当您按前面所示创建 product_dimension
表时,Vertica 会将主键列 product_key
和 product_version
设置为 NOT NULL
,并将它们相应地存储在编录中:
> SELECT EXPORT_TABLES('','product_dimension');
...
CREATE TABLE public.product_dimension
(
product_key int NOT NULL,
product_version int NOT NULL,
product_description varchar(128),
sku_number char(32),
category_description char(32),
CONSTRAINT C_UNIQUE UNIQUE (sku_number) DISABLED,
CONSTRAINT pk PRIMARY KEY (product_key, product_version) ENABLED
);
(1 row)
如果您使用 ALTER TABLE
为现有表指定主键,Vertica 会通知您将主键列设置为 NOT NULL
:
WARNING 2623: Column "column-name" definition changed to NOT NULL