外键约束
外键通过引用其主键将一个表联接到另一个表。外键约束指定外键只能包含被引用主键中的值,从而确保在两个键上联接的数据的引用完整性。
您可以在创建表时标识表的外键,也可以在现有表中使用
ALTER TABLE
标识表的外键。例如,下面的 CREATE TABLE
语句定义了两个外键约束: fk_store_orders_store
和 fk_store_orders_vendor
:
=> CREATE TABLE store.store_orders_fact(
product_key int NOT NULL,
product_version int NOT NULL,
store_key int NOT NULL CONSTRAINT fk_store_orders_store REFERENCES store.store_dimension (store_key),
vendor_key int NOT NULL CONSTRAINT fk_store_orders_vendor REFERENCES public.vendor_dimension (vendor_key),
employee_key int NOT NULL,
order_number int NOT NULL,
date_ordered date,
date_shipped date,
expected_delivery_date date,
date_delivered date,
quantity_ordered int,
quantity_delivered int,
shipper_name varchar(32),
unit_price int,
shipping_cost int,
total_order_cost int,
quantity_in_stock int,
reorder_level int,
overstock_ceiling int
);
下面的 ALTER TABLE
语句在同一个表中添加外键约束 fk_store_orders_employee
:
=> ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_employee
FOREIGN KEY (employee_key) REFERENCES public.employee_dimension (employee_key);
REFERENCES
子句可以省略被引用列的名称,但前提是被引用列与外键列同名。例如,下面的 ALTER TABLE
语句等效于上面的语句:
=> ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_employee
FOREIGN KEY (employee_key) REFERENCES public.employee_dimension;
多列外键
如果外键引用的主键包含多列,则外键必须包含相同数量的列。例如,public.product_dimension
表的主键包含两列:product_key
和 product_version
。在这种情况下,CREATE TABLE
可以定义一个引用该主键的外键约束,如下所示:
=> CREATE TABLE store.store_orders_fact3(
product_key int NOT NULL,
product_version int NOT NULL,
...
CONSTRAINT fk_store_orders_product
FOREIGN KEY (product_key, product_version) REFERENCES public.product_dimension (product_key, product_version)
);
CREATE TABLE
CREATE TABLE
只有在定义所有表列之后才能指定多列外键。还可以使用单独的
ALTER TABLE...ADD CONSTRAINT
语句指定表的外键:
=> ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_product
FOREIGN KEY (product_key, product_version) REFERENCES public.product_dimension (product_key, product_version);
在这两个示例中,约束都指定被引用表中的列。如果被引用列与外键列同名,则 REFERENCES
子句可以省略它们。例如,下面的 ALTER TABLE 语句等效于上面的语句:
=> ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_product
FOREIGN KEY (product_key, product_version) REFERENCES public.product_dimension;
外键中的 NULL 值
其列省略 NOT NULL 的外键可以包含 NULL 值,即使主键不包含 NULL 值也是如此。因此,即使不知道外键,也可以将行插入到表中。