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

sha*_*ank 7 postgresql enums alter-table

"ENGINE"在 Postgres 数据库中有一个表,我必须在其中将名为loglevelstring的列的数据类型更改为 enum。

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

ALTER [ COLUMN ] column TYPE type [ USING expression ]
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

enum本身不是数据类型。它是一数据类型。(通常,您可以将 anyenum用 FK 列替换为 1:n 表。)并且“字符串”在 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
$$;
Run Code Online (Sandbox Code Playgroud)

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

有关的:

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

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

ALTER TABLE "ENGINE" ALTER loglevel TYPE loglevel USING loglevel::loglevel;
Run Code Online (Sandbox Code Playgroud)

细节:

  • @TheHoff:是的,“USING loglevel::loglevel”在这里实现了“USING column::new_type”。 (2认同)