当 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;
中测试
我正在尝试将列从文本转换为枚举值,其中文本值与新枚举不匹配。这对 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;
中测试