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 NULL
和UNIQUE
的组合。无论如何,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中唯一的部分复合主键的主要内容,如果未能解决你的问题,请参考以下文章