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

Postgresql 9.1枚举类型排序不像我预期的那样工作

  •  1
  • Pointy  · 技术社区  · 10 年前

    我有一个枚举类型,我对以特定方式排序很感兴趣。我已经编写并运行了SQL,通过按照我的新标准对标签(外部)进行排序,然后更新 enumsortorder 对于所有值。

    它不起作用。我已经验证过,我已经满足了排序排序功能仅适用于具有偶oid的枚举类型这一(非常奇怪的)规则;我对这种类型的oid是偶数(58016)。据我所知,当我 ORDER BY 枚举列与以前完全相同。

    为了完成这项工作,我还需要做些什么吗?PostgreSQL文档让我觉得它应该可以工作。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Jasen    9 年前

    Even oids have fixed ordering 因此,不能通过修改pgenum系统表对它们进行重新排序。

    您将不得不用新的枚举类型替换现有的枚举。这意味着

    1. 创建新枚举类型
    2. 删除使用枚举的任何关系。
    3. 使用以下命令将列更新为新类型

      ALTER TABLE foo ALTER COLUMN bar TYPE TO new_enum_type USING (bar::text)::new_enum_type;

      此处,转换为文本将新枚举值与旧枚举值按名称进行匹配。

    4. 最后,您需要重新创建所有已删除的关系。

    如果需要,您可以在事务块中运行所有这些DML。

    如果你有大量的数据在重写整个过程中,那么它会很慢 桌子