我们在表中有一个varchar列,我们需要升级到枚举类型。
varchar列中的所有值都是枚举中的有效值。 varchar列中没有空值。
ALTER TABLE tableName
ALTER COLUMN varcharColumn TYPE enum_type
错误:列“varcharColumn”无法强制转换为类型enum_type SQL状态:42804
关于方式的回合是
有没有更好的方法来实现这一目标?
提前致谢。
答案 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成为可能,因此不会像枚举那样“笨拙”。
典型的枚举是例如日志级别,而域是例如电子邮件文本输入验证,其中该字段存在于许多表中。