Postgres中唯一的部分复合主键

Posted

技术标签:

【中文标题】Postgres中唯一的部分复合主键【英文标题】:Unique partial composite primary key in Postgres 【发布时间】:2021-01-21 17:57:23 【问题描述】:

我猜答案是否定的,但是...是否可以仅对复合主键的一部分强制唯一性?

create table foo (
  id integer,
  yesno boolean,
  extra text,
  primary key (id, yesno, extra)
)

这里的想法是我希望 id + yesno 对于这个特定的表是唯一的,但我想在索引中包含 extra 以便我可以利用 Postgres index-only scans。

是的,我可以在 id + yesno 上创建第二个唯一索引,但这会很浪费。

【问题讨论】:

根据定义,主键不能是“部分” 默认情况下,主键是NOT NULLUNIQUE 的组合。无论如何,TEXT 字段上的索引似乎“很重”。 【参考方案1】:

您可以使用INCLUDE 选项在索引中添加实际上不属于索引本身的额外列。

create table foo (
  id integer not null,
  yesno boolean not null,
  extra text
);
Create unique index foo_uk 
           on foo (id, yesno) 
      include (extra);

您没有说明您拥有的 Postgres 版本,因此这可能不合适,因为您至少需要版本 11。

【讨论】:

这个方案唯一的缺点就是这个“主键”不能被外键引用。 是的。但如果需要参考,我可能会添加一个代理作为 PK,而不是传播原始的多列 PK。这肯定是这个解决方案的选择。

以上是关于Postgres中唯一的部分复合主键的主要内容,如果未能解决你的问题,请参考以下文章

复合索引主键与唯一自增主键

带有 CLOB 数据点的 Oracle 复合主键

Hibernate 的复合主键

什么是复合主键

jpa 复合主键并可与唯一键连接

mysql的联合主键与复合主键区别