2013-03-27 60 views
13

我们在表中有一个varchar列,我们需要升级到枚举类型。在postgresql中将varchar列升级为枚举类型

varchar列中的所有值都是枚举中的有效值。 varchar列中没有空值。

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 

错误:列 “varcharColumn” 不能转换为enum_type SQL状态类型:42804

大约方式的轮是

  1. 创建枚举类型另一个新列。
  2. 在类型转换之后使用varchar列更新枚举类型列。
  3. 删除varchar列。
  4. 将枚举类型列名重命名为varchar列名。

有没有更好的方法来实现这一目标?

在此先感谢。

回答

24

您需要定义要使用的转换,因为没有默认转换可用。

如果varcharColumn所有值符合枚举的定义,下面应该工作:

alter table foo 
    ALTER COLUMN varcharColumn TYPE enum_type using varcharColumn::enum_type; 

我个人不喜欢枚举,因为他们是相当不易伸缩。如果我想限制列中的值,我更喜欢varchar列的检查约束。或者 - 如果值列表经常变化并且将会增长 - 带有外键约束的旧的“查找表”。

+0

当使用某些客户端应用程序而不是查找表或简单的约束列时,枚举也会产生更多问题。因为任何在JPA/Hibernate中使用枚举的可疑人员都知道。 – 2013-03-27 11:12:49

+0

谢谢a_horse_with_no_name!尽管我从文档中找到了解决方案,但您的解释非常全面和有用。 – Gopal 2013-03-27 11:34:25

+0

我最近需要通过将枚举移动到模式来重新组织枚举,这对他们来说更有意义。因此,依赖枚举的表需要将其类型“更改”为指向枚举的新位置。我做了如下,双重演员:'alter table my_schema.my_column改变列sale_item_status类型my_schema.my_column_enum 使用((my_column :: text):: my_schema.my_column_enum) - HTH任何其他人与枚举“问题“ – 2013-10-24 23:21:49

3

明白了。

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 
    USING varcharColumn::enum_type 

将更新成功。