Postgresql 9.1 枚举类型排序不像我预期的那样工作
Postgresql 9.1 enum type ordering doesn't work like I expect
我有一个枚举类型,我对以特定方式排序很感兴趣。我已经编写 运行 SQL 以根据我的新标准对标签(外部)进行排序,然后更新所有值的 enumsortorder
来实施新的排序。
没用。我已经验证我已经满足(真的很奇怪)规则,即排序顺序功能仅适用于具有偶数 oid 的枚举类型;我对这种类型的 oid 是偶数 (58016)。据我所知,当我 ORDER BY
枚举列时强加的顺序与以前完全相同。
为了完成这项工作,我还需要做些什么吗? PostgreSQL 文档让我认为它应该可以工作。
Even oids have fixed ordering 所以你不能通过修改 pg-enum 系统来重新排序它们 table.
您将不得不用新的枚举类型替换现有的枚举。这意味着
- 正在创建新的枚举类型
- 删除任何使用枚举的关系。
使用类似
的方式将列更新为新类型
ALTER TABLE foo ALTER COLUMN bar
TYPE TO new_enum_type
USING (bar::text)::new_enum_type;
此处转换为文本将新枚举值与旧枚举值按名称匹配。
最后您需要重新创建所有删除的关系。
如果需要,您可以 运行 将所有这些 DML 放在事务块中。
如果你有很多数据,预计它会很慢,因为它正在重写整个
table秒
我有一个枚举类型,我对以特定方式排序很感兴趣。我已经编写 运行 SQL 以根据我的新标准对标签(外部)进行排序,然后更新所有值的 enumsortorder
来实施新的排序。
没用。我已经验证我已经满足(真的很奇怪)规则,即排序顺序功能仅适用于具有偶数 oid 的枚举类型;我对这种类型的 oid 是偶数 (58016)。据我所知,当我 ORDER BY
枚举列时强加的顺序与以前完全相同。
为了完成这项工作,我还需要做些什么吗? PostgreSQL 文档让我认为它应该可以工作。
Even oids have fixed ordering 所以你不能通过修改 pg-enum 系统来重新排序它们 table.
您将不得不用新的枚举类型替换现有的枚举。这意味着
- 正在创建新的枚举类型
- 删除任何使用枚举的关系。
使用类似
的方式将列更新为新类型ALTER TABLE foo ALTER COLUMN bar TYPE TO new_enum_type USING (bar::text)::new_enum_type;
此处转换为文本将新枚举值与旧枚举值按名称匹配。
最后您需要重新创建所有删除的关系。
如果需要,您可以 运行 将所有这些 DML 放在事务块中。
如果你有很多数据,预计它会很慢,因为它正在重写整个 table秒