PostgreSQL中的外键与主键

在 PostgreSQL 中,外键(Foreign Key) 是一种用于建立表间关联的数据库约束机制,其核心作用与主键(Primary Key)有显著区别。以下是详细解析:

一、外键的定义与作用

  1. 定义

    外键是表中的一个或多个字段,其值必须引用另一个表(父表)的主键或唯一键 。例如,订单表中的 customer_id 字段可以是客户表主键 id 的外键

  2. 核心作用

维护参照完整性:确保子表(外键所在表)的数据必须存在于父表中,避免"无效引用"。例如,订单中的客户 ID 必须存在于客户表中。

级联操作支持:当父表数据更新或删除时,可自动同步子表数据。例如

sql 复制代码
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(id) ON DELETE CASCADE 
);

当父表 customers 中的某行被删除,子表 orders 中关联的订单也会被级联删除。

数据关系建模:通过外键明确表间关联(如一对多、多对多关系),支持复杂查询。

二、外键与主键的区别

特性 外键 主键
唯一性 允许重复值(只要父表存在对应值) 值必须唯一且非空
空值处理 可包含 NULL(除非显式约束为 NOT NULL) 不允许 NULL
数量限制 一个表可有多个外键 一个表仅有一个主键
功能定位 建立表间关联 唯一标识表中的每行数据
约束类型 依赖父表的主键或唯一键 自身字段的唯一性和非空性

三、典型应用场景

  1. 订单系统
    订单表通过外键 user_id 关联用户表,确保每个订单对应有效用户。
  2. 多表级联操作
    删除用户时自动删除其所有订单(通过 ON DELETE CASCADE);ON DELETE CASCADE:当父表的行被删除时,相关的子表行也将被删除。ON UPDATE CASCADE:当父表的主键被更新时,相关的子表行也将被更新。其他级联操作如 SET NULL, SET DEFAULT, RESTRICTNO ACTION 也是可用的。
  3. 数据冗余控制
    将重复数据(如地区信息)抽离到独立表,通过外键引用减少冗余

四、外键的高级配置

  1. 约束行为
    • ON DELETE RESTRICT:阻止删除父表关联数据。
    • ON UPDATE CASCADE:父表主键更新时同步子表外键。
    • 子表(包含外键的表)的外键值必须引用父表中存在的值。如果引用了不存在的值,将引发外键违反错误
  2. 性能优化
    外键字段建议创建索引,以加速关联查询。

五、总结

  • 外键是跨表数据一致性的"守护者",通过引用关系确保数据有效性和级联操作。
  • 主键是表内数据的唯一标识,强制唯一性和非空约束。
  • 合理使用外键能显著提升数据库设计的规范性和可维护性,但需注意级联操作对性能的影响。

如需具体操作示例或约束语法细节,可参考 PostgreSQL 官方文档。

相关推荐
学地理的小胖砸44 分钟前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1231 小时前
Redis解析
数据库·redis·缓存
数据库幼崽1 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd2 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou2 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh3 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵4 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多4 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆4 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams5 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存