Postgresql分区表唯一索引问题

van*_*ada 6 postgresql

postgres 14

我有一些表:

CREATE TABLE sometable (
    id integer NOT NULL PRIMARY KEY UNIQUE ,
    a integer NOT NULL  DEFAULT 1,
    b varchar(32) UNIQUE)
PARTITION BY RANGE (id);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试执行它时,我得到了

ERROR: unique constraint on partitioned table must include all partitioning columns
Run Code Online (Sandbox Code Playgroud)

如果我执行相同的表定义而不PARTITION BY RANGE (id)检查索引,我得到:

 tablename    indexname                                   indexdef

 sometable, sometable_b_key, CREATE UNIQUE INDEX sometable_b_key ON public.sometable USING btree (b)
 sometable, sometable_pkey, CREATE UNIQUE INDEX sometable_pkey ON public.sometable USING btree (id)
Run Code Online (Sandbox Code Playgroud)

所以...存在独特的限制

有什么问题?我该如何修复它?

Lau*_*lbe 18

在分区表上,所有主键、唯一约束和唯一索引都必须包含分区表达式。这是因为分区表上的索引是由每个分区上的单独索引实现的,并且无法强制不同索引之间的唯一性。

如果你想使用分区,你就必须牺牲一些一致性保证。没有办法解决这个问题。您可以做的是在分区上创建唯一的约束。这将保证每个分区内的唯一性,但不能保证全局唯一性。