29

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

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type

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

迂回的方法是

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

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

提前致谢。

4

3 回答 3

51

您需要定义要使用的演员表,因为没有可用的默认演员表。

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

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

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

于 2013-03-27T09:53:41.900 回答
6

知道了。

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

将成功更新它。

于 2013-03-27T09:51:54.313 回答
0

如果您不需要枚举排序属性并且由于缺少删除枚举值而被淘汰,您也可以考虑域类型。
域类型是用户定义类型 + 约束,这使得 x 可以通过CHECK& co 进行选择,因此不像枚举那样“笨拙”。

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

于 2020-04-08T13:49:35.897 回答