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

时间:2015-01-23 16:32:50

标签: postgresql enums postgresql-9.1

我有一个枚举类型,我有兴趣以特定方式订购。我编写并运行SQL以通过我的新条件对标签(外部)进行排序,然后为所有值更新enumsortorder来强制执行新的排序。

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

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

1 个答案:

答案 0 :(得分:2)

Even oids have fixed ordering因此您无法通过修改pg-enum系统表对它们进行重新排序。

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

  1. 创建新的枚举类型
  2. 删除使用枚举的所有关系。
  3. 使用

    之类的内容将列更新为新类型

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

    此处,强制转换为文本将新枚举值与旧枚举值的名称相匹配。

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

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

    如果你有大量的数据重写,那么预计会很慢 表