【问题标题】:Upgrading enum type column to varchar in postgresql在postgresql中将枚举类型列升级为varchar
【发布时间】:2017-05-09 09:06:23
【问题描述】:

我的表中有一个枚举类型列。我现在决定将其设为 varchar 类型并设置一些约束。

Q1)这是一个好习惯:有枚举或在列上放置约束。

Q2) 如何将我的枚举类型列更改为 varchar。与这个问题 question 正好相反。 我试过用这个:

ALTER TABLE tablename ALTER COLUMN columnname  TYPE VARCHAR

但这给了我错误:No operator matches the given name and argument type(s). You might need to add explicit type casts.

这是表定义:

CREATE TABLE tablename (
    id1 TEXT NOT NULL,
    id2 VARCHAR(100) NOT NULL,
    enum_field table_enum,
    modified_on TIMESTAMP NOT NULL DEFAULT NOW(),
    modified_by VARCHAR(100),
    PRIMARY key (id1, id2)
); 

【问题讨论】:

  • 它对我有用。你能用CREATE TYPE 和CREATE TABLE 语句扩展问题以便我重现问题吗?
  • 如果您尝试:ALTER TABLE tablename ALTER COLUMN columnname TYPE VARCHAR USING columnname::text 会发生什么?该消息表明它无法将您的枚举(从技术上讲是一种类型)转换为varchar,可能是因为枚举不是简单类型。您可能有一些成功的类型转换为文本。来自postgresql.org/docs/current/static/sql-altertable.html:“如果没有从旧类型到新类型的隐式或赋值强制转换,则必须提供 USING 子句”。
  • @manngo 运算符不存在:字符变化 = table_enum:这是我在运行您建议的命令时遇到的错误。 table_enum 是我的表的枚举字段。
  • @LaurenzAlbe 这就是我创建表的方式:CREATE TABLE 表名(id1 TEXT NOT NULL,id2 VARCHAR(100) NOT NULL,enum_field table_enum,modified_on TIMESTAMP NOT NULL DEFAULT NOW(),modified_by VARCHAR( 100), 主键 (id1, id2) );
  • @SouravPrem 你也可以发布table_enum的定义吗?

标签: postgresql enums


【解决方案1】:

供将来参考:我在更改枚举类型时遇到了类似的问题,并且收到了与上述相同的错误消息。在我的情况下,问题是由部分索引引用了使用该枚举类型的列引起的。

【讨论】:

  • 与检查约束等相同。
  • 这为我解决了问题,谢谢!
【解决方案2】:

就最佳实践而言,最好为可能的值定义一个单独的表,并将列设置为该表的外键。这有以下好处:

  • 新表不仅可以将特定键作为类型,还可以包含附加列,其中包含友好名称、类型含义或更多信息等详细信息
  • 更改可能的值是操纵记录(INSERT、UPDATE 或 DELETE)的问题,这比更改约束或枚举值更易于访问和管理。

【讨论】:

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