【问题标题】:Upgrading a varchar column to enum type in postgresql在 postgresql 中将 varchar 列升级为枚举类型
【发布时间】:2013-03-17 08:31:30
【问题描述】:

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

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type

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

迂回的方法是

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

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

提前致谢。

【问题讨论】:

    标签: sql database postgresql ddl


    【解决方案1】:

    知道了。

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

    会更新成功。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 在使用某些客户端应用程序时,枚举也比查找表或简单的约束列更成问题。任何曾在 JPA/Hibernate 中使用枚举的可疑乐趣的人都知道。
      • 谢谢 a_horse_with_no_name!虽然我从文档中找到了解决方案,但您的解释非常全面和有用。
      • 我最近需要通过将枚举移动到模式来重新组织枚举,如果这样做更有意义的话。因此,依赖于枚举的表需要“更改”其类型以指向枚举的新位置。我按照以下方式进行了双重转换:alter table my_schema.my_column alter column sale_item_status type my_schema.my_column_enum using ((my_column::text)::my_schema.my_column_enum) -- HTH 其他任何有这种性质的枚举“问题”的人
      • 如果您可以随时添加或删除它们,为什么它们不灵活?
      • @Dejell You can't remove a value from a Postgres enum,仅添加或重命名。它需要管理访问权限来更改枚举与普通 CRUD 访问权限来更改连接表。可以使用普通的 CRUD 工具更改连接表,并将保持更新的工作交给非 DBA。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多