PostgreSQL UNIQUE INDEX vs PRIMARY KEY UNIQUE INDEX vs PRIMARY KEY一句话结论PRIMARY KEY UNIQUE NOT NULL 只能有一个。UNIQUE INDEX 可以有多个 允许 NULL 更灵活。核心对比表特性PRIMARY KEYUNIQUE INDEX底层结构B-tree 索引B-tree 索引占用空间相同相同是否允许 NULL❌ 不允许✅ 允许NULL 之间不触发冲突每张表数量限制只能有1 个可以有多个支持ON CONFLICT✅✅隐式创建唯一约束✅ 自动需手动CREATE UNIQUE INDEX语义业务主键行的唯一标识业务唯一性约束辅助索引外键引用✅ 可被外键引用✅ 也可被外键引用底层是同一个东西PostgreSQL 中 PRIMARY KEY 本质上就是NOTNULLUNIQUEINDEX自动命名为 表名_pkey所以两者在存储、查询性能上完全一致没有谁更省空间的说法。NULL 的行为差异重要-- UNIQUE INDEX 允许多行 NULL以下插入不会冲突INSERTINTOt(sell_in_record_id)VALUES(NULL);INSERTINTOt(sell_in_record_id)VALUES(NULL);-- 不报错-- PRIMARY KEY 第一行就会报错INSERTINTOt(sell_in_record_id)VALUES(NULL);-- ERROR: null value in column violates not-null constraint结论如果字段是业务唯一标识且不能为空用 PRIMARY KEY 更安全。ON CONFLICT 写法对比使用 PRIMARY KEYINSERTINTOmagellan_sell_in_summary_raw(sell_in_record_id,qty,...)VALUES(#{sellInRecordId}, #{qty}, ...)ONCONFLICT(sell_in_record_id)DOUPDATESETqtyexcluded.qty,update_timenow();使用 UNIQUE INDEX-- 完全一样的写法PostgreSQL 自动找到对应的唯一索引INSERTINTOsome_table(unique_col,other_col)VALUES(#{val}, #{other})ONCONFLICT(unique_col)DOUPDATESETother_colexcluded.other_col;两种写法语法完全相同ON CONFLICT (列名)会自动匹配对应的唯一约束无论是 PK 还是 UNIQUE INDEX。什么时候用哪个场景推荐业务主键如sell_in_record_id不允许为空全表唯一标识PRIMARY KEY需要多列组合唯一但不是主键如(version, geo, date)联合唯一UNIQUE INDEX字段可能为 NULL但有值时必须唯一UNIQUE INDEX利用 NULL 不冲突特性需要条件唯一如WHERE delete_flag falseUNIQUE INDEX支持WHERE分区条件需要函数唯一如lower(email)UNIQUE INDEX支持函数索引进阶UNIQUE INDEX 的独特能力1. 条件唯一索引Partial Unique Index-- 只对未删除的记录保证唯一已删除的不限制CREATEUNIQUEINDEXux_email_activeONusers(email)WHEREdelete_flagfalse;PRIMARY KEY 无法做到这一点。2. 函数唯一索引-- 邮箱不区分大小写唯一CREATEUNIQUEINDEXux_email_lowerONusers(lower(email));3. 多列组合唯一不作为主键-- 同一 version geo 组合唯一但主键是自增 idCREATEUNIQUEINDEXux_version_geoONsome_table(version_number,geo_cd);magellan_sell_in_summary_raw 的选择-- 调整前两个索引浪费空间CREATETABLEmagellan_sell_in_summary_raw(id bigserialPRIMARYKEY,-- 索引1on idsell_in_record_idvarchar(267),-- 无约束...);CREATEUNIQUEINDEXux_si_summary_raw_record_idONmagellan_sell_in_summary_raw(sell_in_record_id);-- 索引2on sell_in_record_id-- 调整后一个索引语义清晰CREATETABLEmagellan_sell_in_summary_raw(sell_in_record_idvarchar(267)PRIMARYKEY,-- 索引1唯一on sell_in_record_id...);好处减少 1 个 B-tree 索引节省存储 写入性能更好去掉无业务意义的id字段和bigserial序列对象ON CONFLICT (sell_in_record_id)直接走 PK语义清晰自带NOT NULL保护防止意外写入空值

相关新闻

最新新闻

【SkyWalking从入门到精通】第64篇:Trace数据的采集与指标监控——OAL计算、批量操作与数据积压全面监控

【SkyWalking从入门到精通】第64篇:Trace数据的采集与指标监控——OAL计算、批量操作与数据积压全面监控

下一篇【第63篇】监控SkyWalking本身——别让你的APM成为盲点 上一篇【第65篇】Service Mesh数据的采集监控——Mixer与ALS模式的监控差异与排查指南 一、Trace数据在OAP内部的"旅行" 一条Trace从Agent发出到最终写入存储,在OAP内部要经过怎样的旅程&…

2026/7/22 12:17:37
室内给水管道水压试验标准与施工验收详解

室内给水管道水压试验标准与施工验收详解

在建筑给排水施工与验收中,给水管道压力试验是隐蔽工程核心的质检工序。室内水管多暗敷于墙体、地面、吊顶内部,属于典型隐蔽工程,若施工完成、封槽铺装后出现渗漏,会产生拆改维修、设施损坏、邻里赔付等一系列问题。因此&#xf…

2026/7/22 12:17:37
奇门动力:以中国故事+中国技术+中国算力,服务全球创意

奇门动力:以中国故事+中国技术+中国算力,服务全球创意

2026年2月,Seedance 2.0正式上线,掀起全民AI视频创作热潮。一键生成短片、低成本批量产出短剧、快速制作短视频广告,AI工具彻底抹平了视频创作的技术门槛,实现“一人剧组”的轻量化生产图景。但行业狂欢之下,一道清晰鸿…

2026/7/22 12:17:37
2026年无锡不锈钢板材验收TOP5:检查精度×风险防控综合排名

2026年无锡不锈钢板材验收TOP5:检查精度×风险防控综合排名

据国家统计局与冶金工业规划研究院联合数据,2025年我国不锈钢板材表观消费量突破3200万吨,其中冷轧不锈钢板占比超过65%。然而,中国特检院抽检报告显示,约22%的不锈钢板材在到货验收环节存在厚度负偏差超标、表面缺陷漏检、材质证…

2026/7/22 12:17:37
大规模分布式AI训练基础设施

大规模分布式AI训练基础设施

2026年大规模分布式AI训练基础设施全景:从五轴并行到云原生编排 当模型参数突破万亿——分布式训练的终极挑战。本文将从分布式训练框架、GPU集群网络、五轴并行体系、云原生编排四大维度,为读者呈现2026年大规模AI训练基础设施的完整技术图景。 标签: D…

2026/7/22 12:17:37
VC++6.0与MFC开发实战:从环境搭建到项目部署的完整指南

VC++6.0与MFC开发实战:从环境搭建到项目部署的完整指南

1. 项目概述:为什么今天还要聊VC6.0?看到这个标题,很多年轻开发者可能会一愣:VC6.0?那不是上个世纪的古董吗?现在都.NET 8、C20、Visual Studio 2022满天飞了,学这个还有意义吗?作为…

2026/7/22 12:12:36

月新闻