代码之家  ›  专栏  ›  技术社区  ›  XiangZzz

在从Postgres9.4到Greenplum的数据迁移过程中,我应该如何处理我的独特约束

  •  2
  • XiangZzz  · 技术社区  · 8 年前

    当我执行以下sql(包含在由生成的sql文件中)时 pg_dump 9.4)在greenplum中:

    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不允许这样?我真的需要这个独特的约束来保证一些规则,如何在greenplum中修复它?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Evan Carroll    8 年前
    • UNIQUE 约束是通过btree索引完成的
    • 主键暗示 独特的 NOT NULL
    • GreenPlum分发给child/shards或任何您声称为 独特的 .

    独特的 约束——正如您所希望的——该索引必须是

    • 复制给每个孩子
    • 以符合ACID的方式更新

    From the docs about CREATE TABLE

    创建表时,有一个附加子句来声明Greenplum数据库分发策略。 如果未提供DISTRIBUTED BY或DistributedRandomy子句,则Greenplum使用主键(如果表有主键)或表的第一列作为分发键为表分配哈希分发策略。

    同一份文件也提到了主键,

    对于具有主键的表,它必须是散列分布的(不是随机分布的),并且主键唯一的列必须包含Greenplum分布键的所有列。

    这是文件的内容 CREATE INDEX

    在Greenplum数据库中,仅当索引键的列与GreenplumDistribution键相同(或是其超集)时,才允许使用唯一索引。在分区表上,唯一索引仅在单个分区内受支持,而不是跨所有分区。

        2
  •  0
  •   Joe Harris    8 年前

    许多(也许是大多数)分析数据库不支持此类约束。Greenplum在支持可执行性方面有些独特 PRIMARY KEY .

    FWIW,在Redshift中,我在任何更改数据的ETL步骤之后运行额外的逻辑,以确保我的约束仍然有效。

    您可以在这里尝试相同的方法,但我强烈建议您在将要检查的列上划分表。