【发布时间】:2017-07-06 09:58:12
【问题描述】:
我在 Postgres 数据库中有一个表 "ENGINE",我必须在其中将名为 loglevel 的列的数据类型从字符串更改为枚举。
但是,我无法理解手册中的说明:
ALTER [ COLUMN ] column TYPE type [ USING expression ]
【问题讨论】:
标签: postgresql enums alter-table
我在 Postgres 数据库中有一个表 "ENGINE",我必须在其中将名为 loglevel 的列的数据类型从字符串更改为枚举。
但是,我无法理解手册中的说明:
ALTER [ COLUMN ] column TYPE type [ USING expression ]
【问题讨论】:
标签: postgresql enums alter-table
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 column::new_type吗?
USING loglevel::loglevel 在这里实现了USING column::new_type。