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

Gop*_*pal 18 sql database postgresql ddl

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

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type
Run Code Online (Sandbox Code Playgroud)

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

关于方式的回合是

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

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

提前致谢.

a_h*_*ame 35

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

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

alter table foo 
  ALTER COLUMN varcharColumn TYPE enum_type using varcharColumn::enum_type;
Run Code Online (Sandbox Code Playgroud)

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

  • @Dejell [您不能从 Postgres 枚举中删除值](https://www.postgresql.org/docs/10/static/datatype-enum.html#id-1.5.7.15.8),只能添加或改名。它需要管理访问权限来更改枚举与普通 CRUD 访问权限来更改连接表。可以使用普通的 CRUD 工具更改连接表,并将保持更新的工作交给非 DBA。 (2认同)

Gop*_*pal 6

知道了。

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type
    USING varcharColumn::enum_type
Run Code Online (Sandbox Code Playgroud)

将成功更新它。