PostgreSQL中的外键与主键操作示例

 更新时间:2025年10月10日 15:07:49   作者:骐骥1月  
在PostgreSQL中,外键(Foreign Key)是一种用于建立表间关联的数据库约束机制,其核心作用与主键(Primary Key)有显著区别,本文给大家介绍PostgreSQL中的外键与主键操作示例,感兴趣的朋友一起看看吧

什么是外键?

外键(FOREIGN KEY)用于与另一张表关联,列(或一组列)中的值必须匹配另一个表的某一行中出现的值,用于保持数据的一致性。

一个外键约束指定一列(或一组列)中的值必须匹配出现在另一个表中某些行的值。我们说这维持了两个关联表之间的引用完整性。

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

一、外键的定义与作用

  • 定义
    • 外键是表中的一个或多个字段,其值必须引用另一个表(父表)的主键或唯一键。例如,订单表中的 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
数量限制一个表可有多个外键一个表仅有一个主键
功能定位建立表间关联唯一标识表中的每行数据
约束类型依赖父表的主键或唯一键自身字段的唯一性和非空性

三、典型应用场景

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

四、外键的高级配置

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

五、总结

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

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

到此这篇关于PostgreSQL中的外键与主键操作示例的文章就介绍到这了,更多相关PostgreSQL外键与主键内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL日期时间字段类型选择指南

    PostgreSQL日期时间字段类型选择指南

    这段文章详细介绍了在PostgreSQL中选择合适的日期时间数据类型的方法,特别推荐使用timestampwithouttimezone类型来存储精确到微秒的日期和时间,文章对比了多种日期时间数据类型的特点和适用场景,并并并强调了避免使用varchar等存储日期时间的重要性
    2026-06-06
  • PostgreSQL教程(十六):系统视图详解

    PostgreSQL教程(十六):系统视图详解

    这篇文章主要介绍了PostgreSQL教程(十六):系统视图详解,本文讲解了pg_tables、pg_indexes、pg_views、pg_user、pg_roles、pg_rules、pg_settings等视图的作用和字段含义等内容,需要的朋友可以参考下
    2015-05-05
  • PostgreSQL自动更新时间戳实例代码

    PostgreSQL自动更新时间戳实例代码

    最近有这么一个工程,需要使用postgresql数据库,在数据库中的好几个表中都需要时间戳这个字段,这篇文章主要给大家介绍了关于PostgreSQL自动更新时间戳的相关资料,需要的朋友可以参考下
    2021-11-11
  • pgsql 变量赋值方法及注意事项

    pgsql 变量赋值方法及注意事项

    这篇文章主要介绍了pgsql 变量赋值方法及注意事项,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL行转列的多种方法

    PostgreSQL行转列的多种方法

    这篇文章主要介绍了PostgreSQL行转列的多种方法,本文给大家分享三种方法,每种方法结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 在postgresql中通过命令行执行sql文件

    在postgresql中通过命令行执行sql文件

    这篇文章主要介绍了在postgresql中通过命令行执行sql文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 使用postgresql获取当前或某一时间段的年月日

    使用postgresql获取当前或某一时间段的年月日

    这篇文章主要给大家介绍了关于使用postgresql获取当前或某一时间段的年月日的相关资料,在PostgreSQL中可以使用函数 NOW() 来查询当前时间,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • RockyLinux9.5部署PostgreSQL的实现步骤

    RockyLinux9.5部署PostgreSQL的实现步骤

    本文主要介绍两种部署方式,一直接部署在 linux 服务器上,二先安装 docker,然后通过 docker 部署,具有一定的参考价值,感兴趣的可以了解一下
    2025-11-11
  • postgresql 修改列类型操作

    postgresql 修改列类型操作

    这篇文章主要介绍了postgresql 修改列类型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 使用postgresql 模拟批量数据插入的案例

    使用postgresql 模拟批量数据插入的案例

    这篇文章主要介绍了使用postgresql 模拟批量数据插入的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论