当我在greenplum中执行以下sql(包含在Postgres9.4的pg_dump
生成的sql文件中)时:
CREATE TABLE "public"."trm_concept" (
"pid" int8 NOT NULL,
"code" varchar(100) NOT NULL,
"codesystem_pid" int8,
"display" varchar(400) ,
"index_status" int8,
CONSTRAINT "trm_concept_pkey" PRIMARY KEY ("pid"),
CONSTRAINT "idx_concept_cs_code" UNIQUE ("codesystem_pid", "code")
);
我得到这个错误:
ERROR: Greenplum Database does not allow having both PRIMARY KEY and UNIQUE constraints
为什么青梅不允许这样做?我真的需要这个唯一的约束来保证一些规则,我怎么能在greenplum中修复它呢?
最佳答案
使用btree索引执行UNIQUE
约束
主键表示UNIQUE
和NOT NULL
GreenPlum分发给子/碎片或任何你声称UNIQUE
的东西。
为了让GreenTree实现一个UNIQUE
约束——正如您所希望的那样——该索引必须
复制给每个孩子
以符合ACID的方式更新
这样做将完全消除运行绿梅的好处。你还是回到PostgreSQL吧。
From the docs about CREATE TABLE
创建表时,有一个附加子句声明Greenplum数据库分发策略。如果未提供DISTRIBUTED BY或DISTRIBUTED Randomy子句,则Greenplum将使用主键(如果表有主键)或表的第一列作为分发键为表分配哈希分发策略。几何或用户定义数据类型的列不符合Greenplum分布键列的条件。如果表没有合格数据类型的列,则行将基于循环或随机分布进行分布。为了确保Greenplum数据库系统中的数据分布均匀,您需要为每个记录选择一个唯一的分布密钥,如果这不可能,则选择DISTRIBUTED Random。
同一个医生说主键,
要使表具有主键,它必须是散列分布的(不是随机分布的),主键(唯一的列)必须包含Greenplum分布键的所有列。
以下是CREATE INDEX上的文档
在Greenplum数据库中,只有当索引键的列与Greenplum分发键相同(或其超集)时,才允许使用唯一索引。在分区表上,唯一索引仅在单个分区中受支持,而不是在所有分区中受支持。