如何将表列的数据类型更改为枚举?

时间:2017-07-05 22:21:14

标签: postgresql enums alter-table

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

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

ALTER [ COLUMN ] column TYPE type [ USING expression ]

1 个答案:

答案 0 :(得分:2)

enum本身不是数据类型。它是数据类型的。 (通常,您可以将任何带有FK列的enum替换为1:n表。)和" string"在Postgres中根本不是数据类型。我假设我们在谈论textvarchar?如果是这样,这些是您的任务的步骤:

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,因为在任何字符串类型(textvarchar?)和新的enum数据类型之间没有隐式转换:< / p>

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

详细说明: