【问题标题】:Postgresql 9.1 enum type ordering doesn't work like I expectPostgresql 9.1 枚举类型排序不像我预期的那样工作
【发布时间】:2015-01-23 16:32:49
【问题描述】:

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

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

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

【问题讨论】:

  • 你需要奇数的 oid,而不是偶数。 也就是说,如果两个偶数 OID 属于同一个枚举类型,则较小的 OID 必须具有较小的 enumsortorder 值。奇数 OID 值与排序顺序无关。 -- 您可以尝试使用 ALTER TYPE name ADD VALUE new_enum_value [ { BEFORE | AFTER } existing_enum_value ] 向枚举添加一个新值,然后查看排序是否更改(这是 9.1 中的新功能,这就是为什么 odd 规则)
  • @pozs 我阅读了文档的那部分,但它并没有多大意义。我如何控制 oid 值?我可以为现有枚举请求或创建新的 oid 值吗?
  • 并非如此,但您可以尝试为其添加新值(我从未检查过 oid 是否更改)。如果没有,我认为您唯一的选择是删除并重新创建枚举。 (没有明确的重新排序技术,enumsortorder 列主要用于新值)。
  • @pozs 好的,我想我明白了——我对整个事情的运作方式有一个误解。我敢打赌,内脏使用“奇数 oid”技巧来使“之前”和“之后”类型更改起作用,因此这些表条目会得到奇数 oid(如有必要)。或类似的东西。我将重新创建类型。谢谢您的帮助;如果您想要一些代表,请随时输入答案。
  • 是的,这也是我认为的。但是关于它的文档并不多,重新创建类型只是一种解决方法。

标签: postgresql enums postgresql-9.1


【解决方案1】:

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. 最后,您需要重新创建所有删除的关系。

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

如果您有大量数据,预计它会很慢,因为它正在重写整个 表格

【讨论】:

  • 谢谢,这就是我想出的方法来做我想做的事。
猜你喜欢
  • 2012-06-13
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2016-03-07
  • 2013-10-09
  • 2019-08-16
  • 2022-08-02
相关资源
最近更新 更多