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

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type

ERROR: column "varcharColumn" cannot be cast to type enum_type SQL state: 42804

绕道而行是

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

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

提前谢谢您.

推荐答案

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

如果varcharColumn中的所有值都符合枚举定义,则应执行以下操作:

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

我个人不喜欢枚举,因为它们相当僵硬.如果我想限制列中的值,我更喜欢varchar列上的CHECK约束.或者-如果值列表经常更改并将增长-一个带有外键约束的老"查找表".

Database相关问答推荐

MongoDB事务,回调API方法

避免数据库联接的两个查询替换

Prisma - 将属性的类型设置为枚举数组

MongoDB:查询具有两个相等字段 $match 和 $eq 的文档

如何验证 SQLAlchemy ORM 中的列数据类型?

使用 2 个进程处理数据库

我可以在 mysql 中的 select 语句上启动触发器吗?

外键可以作为主键吗?

什么是 Scalar标量查询?

MySQL 中的多个 OR 子句

数据库模式中的多对多关系表是否有正式名称?

如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?

使用 PHP/PDO 判断数据库表是否存在

使用默认路径中的文件创建数据库

数据库触发器的命名约定

Django:检测数据库后端

Select 多模型 DBMS 时要考虑哪些因素? (OrientDB 与 ArangoDB)

NoSQL 数据库是否使用或需要索引?

我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

位图索引有何帮助?