【问题标题】:How to change the data type of a table column to enum?如何将表列的数据类型更改为枚举?
【发布时间】:2017-07-06 09:58:12
【问题描述】:

我在 Postgres 数据库中有一个表 "ENGINE",我必须在其中将名为 loglevel 的列的数据类型从字符串更改为枚举。

但是,我无法理解手册中的说明:

ALTER [ COLUMN ] column TYPE type [ USING expression ]

【问题讨论】:

    标签: postgresql enums alter-table


    【解决方案1】:

    enum 本身不是数据类型。它是数据类型的类。 (通常,您可以将任何 enum 替换为 1:n 表的 FK 列。)并且“字符串”在 Postgres 中根本不是数据类型。我假设我们在谈论text 或varchar?如果是这样,这些是您的任务的步骤:

    1.) 如果 enum 类型尚不存在,则创建它。我们称之为loglevel。它必须包含字符串列中的所有不同值,否则类型转换将失败。这个DO 命令负责处理它:

    DO
    $$
    BEGIN
    EXECUTE (
       SELECT 'CREATE TYPE loglevel AS ENUM (' 
            || string_agg(quote_literal(loglevel), ', ')
            || ')'
       FROM  (
          SELECT loglevel
          FROM   "ENGINE"
          WHERE  loglevel IS NOT NULL  -- exclude NULL if present
          GROUP  BY 1
          ORDER  BY 1
          ) sub
       );
    END
    $$;
    

    如果存在,我们必须排除 NULL,它不能被列为枚举值。 (任何enum 类型都可以为NULL。)

    相关:

    2.) 更改列的数据类型:

    您必须明确指定USING loglevel::loglevel,因为在任何字符串类型(text、varchar?)和新的enum 数据类型之间没有隐式转换:

    ALTER TABLE "ENGINE" ALTER loglevel TYPE loglevel USING loglevel::loglevel;
    

    详情:

    【讨论】:

    • USING 子句的语法是什么?是USING column::new_type吗?
    • @TheHoff:是的,USING loglevel::loglevel 在这里实现了USING column::new_type。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多