sha*_*ank 7 postgresql enums alter-table
我"ENGINE"
在 Postgres 数据库中有一个表,我必须在其中将名为loglevel
string的列的数据类型更改为 enum。
但是,我无法理解手册中的说明:
ALTER [ COLUMN ] column TYPE type [ USING expression ]
Run Code Online (Sandbox Code Playgroud)
enum
本身不是数据类型。它是一类数据类型。(通常,您可以将 anyenum
用 FK 列替换为 1:n 表。)并且“字符串”在 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
$$;
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)
细节:
归档时间: |
|
查看次数: |
1384 次 |
最近记录: |