我在Postgres DB中有一个表"ENGINE",必须将其中名为loglevel的列的数据类型从string更改为enum。但是,我无法理解手册中的说明:
"ENGINE"
loglevel
ALTER [ COLUMN ] column TYPE type [ USING expression ]
anauzrmj1#
enum本身不是数据类型。它是数据类型的一个 * class *。(通常,你可以用FK列替换任何enum到1:n表。)并且"string"在Postgres中根本不是数据类型。我假设我们正在讨论text或varchar。如果是这样,下面是你的任务的步骤:
enum
text
varchar
如果enum类型尚不存在,则创建新的enum类型。我们称之为loglevel,它必须包含string列中的所有不同值,否则类型转换将失败,下面的DO命令负责处理这个问题:
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。)相关:
更改列的数据类型:必须显式指定USING loglevel::loglevel,因为在任何字符串类型(text、varchar、...)和新的enum数据类型之间没有隐式转换:
USING loglevel::loglevel
ALTER TABLE "ENGINE" ALTER loglevel TYPE loglevel USING loglevel::loglevel;
详情:
1条答案
按热度按时间anauzrmj1#
enum
本身不是数据类型。它是数据类型的一个 * class *。(通常,你可以用FK列替换任何enum
到1:n表。)并且"string"在Postgres中根本不是数据类型。我假设我们正在讨论text
或varchar
。如果是这样,下面是你的任务的步骤:步骤1
如果
enum
类型尚不存在,则创建新的enum
类型。我们称之为
loglevel
,它必须包含string列中的所有不同值,否则类型转换将失败,下面的DO
命令负责处理这个问题:我们必须排除NULL,如果存在的话,它不能作为枚举值列出。(任何
enum
类型都可以是NULL。)相关:
步骤2
更改列的数据类型:
必须显式指定
USING loglevel::loglevel
,因为在任何字符串类型(text
、varchar
、...)和新的enum
数据类型之间没有隐式转换:详情: