一、外键的定义与作用
-
定义 外键是表中的一个或多个字段,其值必须引用另一个表(父表)的主键或唯一键。例如,订单表中的
customer_id字段可以是客户表主键id的外键。 -
核心作用
- 维护参照完整性:确保子表(外键所在表)的数据必须存在于父表中,避免'无效引用'。例如,订单中的客户 ID 必须存在于客户表中。
- 级联操作支持:当父表数据更新或删除时,可自动同步子表数据。
当父表CREATE TABLE orders ( id SERIAL PRIMARY KEY, customer_id INT REFERENCES customers(id) ON DELETE CASCADE );customers中的某行被删除,子表orders中关联的订单也会被级联删除。 - 数据关系建模:通过外键明确表间关联(如一对多、多对多关系),支持复杂查询。
二、外键与主键的区别
| 特性 | 外键 | 主键 |
|---|---|---|
| 唯一性 | 允许重复值(只要父表存在对应值) | 值必须唯一且非空 |
| 空值处理 | 可包含 NULL(除非显式约束为 NOT NULL) | 不允许 NULL |
| 数量限制 | 一个表可有多个外键 | 一个表仅有一个主键 |
| 功能定位 | 建立表间关联 | 唯一标识表中的每行数据 |
| 约束类型 | 依赖父表的主键或唯一键 | 自身字段的唯一性和非空性 |
三、典型应用场景
-
订单系统 订单表通过外键
user_id关联用户表,确保每个订单对应有效用户。 -
多表级联操作 删除用户时自动删除其所有订单(通过
ON DELETE CASCADE)。其他级联操作如SET NULL,SET DEFAULT,RESTRICT和NO ACTION也是可用的。ON DELETE CASCADE:当父表的行被删除时,相关的子表行也将被删除。ON UPDATE CASCADE:当父表的主键被更新时,相关的子表行也将被更新。
-
数据冗余控制 将重复数据(如地区信息)抽离到独立表,通过外键引用减少冗余。
四、外键的高级配置
-
约束行为
ON DELETE RESTRICT:阻止删除父表关联数据。- :父表主键更新时同步子表外键。


