在 PostgreSQL 中,外键(Foreign Key)是一种数据库约束,用于维护表之间的关联关系。外键确保一个表的一列(子列)的值引用了另一个表(父表)的主键或唯一键列的值。这有助于维护表之间的一致性和完整性,以及执行引用完整性检查。
-
外键约束的创建:要在表中创建外键,你需要使用
FOREIGN KEY
约束。外键约束会将一个表的列与另一个表的主键或唯一约束关联起来。示例:CREATE TABLE orders ( order_id serial PRIMARY KEY, customer_id integer, order_date date, -- 创建外键约束,将 customer_id 与 customers 表的 customer_id 关联 FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );
-
外键约束的作用:
- 引用完整性:外键确保引用的数据在父表中存在。如果尝试插入或更新一个无效的外键值,将触发约束违反错误。
- 维护数据关系:外键定义了表之间的关联关系。这对于建立复杂的数据模型和查询非常有用。
- 级联操作:外键约束还支持级联操作。这意味着可以在删除或更新父表的行时自动执行相关操作,如级联删除或级联更新。
-
级联操作:外键约束支持以下级联操作:
ON DELETE CASCADE
:当父表的行被删除时,相关的子表行也将被删除。ON UPDATE CASCADE
:当父表的主键被更新时,相关的子表行也将被更新。- 其他级联操作如
SET NULL
,SET DEFAULT
,RESTRICT
和NO ACTION
也是可用的。
-
外键的限制:
- 子表(包含外键的表)的外键值必须引用父表中存在的值。如果引用了不存在的值,将引发外键违反错误,比如:
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
-- weather表中的city指向cites表中的city主键
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
现在尝试插入一个非法的记录:
INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey"
"weather_city_fkey"
DETAIL: Key (city)=(Berkeley) is not present in table "cities".
此时执行插入的语句抛出了一个外键约束的异常,因为向weather
表中插入的数据中,包含了主表cites
中不存在的数据Berkeley
- 外键引用不能包含
NULL
值,除非父表的唯一键列也允许NULL
。
- 删除外键约束:可以使用
DROP CONSTRAINT
语句来删除外键约束。
ALTER TABLE weather DROP CONSTRAINT weather_city_fkey;
外键名字默认是附表名_主表名_fkey
。
PostgreSQL 的外键约束是保持数据库完整性的重要工具之一,它有助于确保数据的一致性,同时支持建立复杂的数据模型。