PostgreSQL citus常见报错问题分析(二)DETAIL: Distributed relations cannot have时间:2022-03-16 00:38:45错误如下: ```SQL ERROR: cannot create constraint on "test" DETAIL: Distributed relations cannot have UNIQUE, EXCLUDE, or PRIMARY KEY constraints that do not include the partition column (with an equality operator if EXCLUDE). ``` 创建测试表 ```SQL lightdb@test=# create table test(id bigint,name varchar(100)); CREATE TABLE lightdb@test=# alter table test add primary key (id); ALTER TABLE lightdb@test=# select create_distributed_table('test','name'); ERROR: cannot create constraint on "test" DETAIL: Distributed relations cannot have UNIQUE, EXCLUDE, or PRIMARY KEY constraints that do not include the partition column (with an equality operator if EXCLUDE). ``` ## 原因如下 **唯一约束必须包含分片键** 这个错误提示在 Citus 中创建了一个分布式表,并且在表上定义了 UNIQUE、EXCLUDE 或 PRIMARY KEY 约束,但约束中没有包含分区列(或分区列的一部分),因此 Citus 无法在分布式环境中正确地强制执行这些约束。 在 Citus 中,数据通常被分区并存储在不同的节点上,每个节点上存储的数据子集只能部分地表示分布式表的完整数据集。这就需要 Citus 在整个分布式集群上保证数据一致性和正确性,因此 Citus 需要在分布式表上使用分区键或分区键的一部分来定义这些约束。 例如,假设我们有一个表 orders,其分区键为 order_id,并且我们想在该表上定义一个唯一约束,以确保每个订单 ID 都是唯一的。在 Citus中,我们应该将分区键 order_id 包含在唯一约束中,这样 Citus 才能确保唯一性约束适用于整个分布式表的所有节点,从而避免重复数据在不同的节点上出现。 因此,当您在 Citus 中创建分布式表并定义 UNIQUE、EXCLUDE 或 PRIMARY KEY 约束时,请确保这些约束包括分区键或分区键的一部分,以确保约束可以在整个分布式集群上正确地强制执行。如果没有包含分区键或分区键的一部分,则会出现您所描述的错误提示。