我如何解决 Postgresql 错误,“没有为可排序类型 citext 的列“foo”派生排序规则”?

Eva*_*oll 5 postgresql collation postgresql-9.1 citext

就在最近,我从 Postgresql 8.4.11 升级到 9.1.3。我在这个过程中使用了 pg_dump。现在我收到一个错误:

错误:没有为可排序类型 citext 的列“vin”派生排序规则
提示:使用 COLLATE 子句显式设置排序规则。

这是我之前遇到问题的延续。发行说明中建议的修复似乎没有捕获自定义域。似乎8.4 中的CREATE DOMAIN语句甚至不支持该COLLATE子句。

这就是我创建vin类型的方式,

CREATE DOMAIN inventory.valid_vin AS citext
  CHECK ( inventory.valid_vin( VALUE ) );
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 2

有关这方面的更多信息,请参阅我们在此线程上的通信:

问题

问题就出自汤姆·莱恩之口,

好吧,如果这就是您创建 citext * 的方式,那么它就坏了。从 9.1 开始,需要使用属性“COLLATABLE = true”创建 citext 类型。建议的 UPDATE 语句是一种纠正事后失败的方法,但它们不涵盖已在 citext 之上创建的任何域。

资料来源:http ://archives.postgresql.org/pgsql-general/2012-05/msg00262.php

*我正在创建 citext,但是我的特定转储已创建它,没有什么特别的。

因此,如果您拥有 citext 上的域,则不支持从 8.3 -> 9.1 进行转储/恢复。

解决方案

您可以首先执行以下操作来解决此问题:

  • CREATE EXTENSION citext在加载转储之前。
  • 或者,通过破解补丁来在DOMAINScitext 上运行。