当 TEXT 值不匹配时,postgres 将文本转换为 ENUM

postgres converting text to ENUM when TEXT values don't match

我正在尝试将列从文本转换为枚举值,其中文本值与新枚举不匹配。这对 Postgres 是否可行,而不必先删除该列或事先编写一堆更新脚本?

CREATE TABLE "test_table" (
    "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
    "shape" text
);

insert into test_table(shape) values ('Round');
insert into test_table(shape) values ('Square');

CREATE TYPE "public"."test_table_shape_enum" AS ENUM(
    'round',
    'square'
    );

ALTER TABLE test_table
    ALTER shape TYPE test_table_shape_enum USING shape::test_table_shape_enum;

[22P02] ERROR: invalid input value for enum test_table_shape_enum: "Round"

我看到的几种方法是在执行更改之前对所有行进行更新。

update test_table set shape='round' where shape='Round';
update test_table set shape='square' where shape='Square';

不过要是能一劳永逸就好了;有没有更好的方法来做到这一点,而不必在 运行 alter 命令之前编写一堆更新脚本?

如果唯一的问题是字母大小写,请使用 lower():

ALTER TABLE test_table
    ALTER shape TYPE test_table_shape_enum 
    USING lower(shape)::test_table_shape_enum;

Db<>Fiddle.

中测试