在postgresql中将varchar列升级为枚举类型

时间:2013-03-27 09:48:01

标签: sql database postgresql ddl

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

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type

错误:列“varcharColumn”无法强制转换为类型enum_type SQL状态:42804

关于方式的回合是

  1. 使用枚举类型创建另一个新列。
  2. 在类型转换后使用varchar列更新枚举类型列。
  3. 删除varchar列。
  4. 将枚举类型列名重命名为varchar列名。
  5. 有没有更好的方法来实现这一目标?

    提前致谢。

3 个答案:

答案 0 :(得分:32)

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

如果varcharColumn中的所有值都符合枚举定义,则以下内容应该有效:

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

我个人不喜欢枚举,因为它们非常不灵活。如果我想限制列中的值,我更喜欢varchar列上的检查约束。或者 - 如果值列表经常变化并且将会增长 - 一个带有外键约束的旧的“查找表”。

答案 1 :(得分:3)

知道了。

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

会成功更新。

答案 2 :(得分:0)

如果您不需要枚举顺序属性并且由于缺少删除枚举值而受到争议,那么您也可以考虑域类型。
域类型是用户防御类型+约束,这使得通过CHECK&co进行选择时x成为可能,因此不会像枚举那样“笨拙”。

典型的枚举是例如日志级别,而域是例如电子邮件文本输入验证,其中该字段存在于许多表中。