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

n3schb8v  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(1)|浏览(173)

我在Postgres DB中有一个表"ENGINE",必须将其中名为loglevel的列的数据类型从string更改为enum。
但是,我无法理解手册中的说明:

ALTER [ COLUMN ] column TYPE type [ USING expression ]
anauzrmj

anauzrmj1#

enum本身不是数据类型。它是数据类型的一个 * class *。(通常,你可以用FK列替换任何enum到1:n表。)并且"string"在Postgres中根本不是数据类型。我假设我们正在讨论textvarchar。如果是这样,下面是你的任务的步骤:

步骤1

如果enum类型尚不存在,则创建新的enum类型。
我们称之为loglevel,它必须包含string列中的所有不同值,否则类型转换将失败,下面的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。)
相关:

  • Postgres中的代数数据类型

步骤2

更改列的数据类型:
必须显式指定USING loglevel::loglevel,因为在任何字符串类型(textvarchar、...)和新的enum数据类型之间没有隐式转换:

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

详情:

  • Rails迁移:试图将列的类型从字符串更改为整数

相关问题