在 postgres 中删除单个枚举值

Drop a single enum value in postgres

假设我有以下枚举:

CREATE TYPE "my_enum" AS ENUM('value1', 'value2', 'value3');

我想要移除 value3。根据我在文档和之前的线程中看到的内容,我实际上必须删除整个枚举并使用我想要的值重新创建它。像这样:

DROP TYPE IF EXISTS "my_enum";

CREATE TYPE "my_enum" AS ENUM('value1', 'value2');

问题是我有其他表依赖于这个枚举,所以它不允许我这样做。我收到以下消息(理所当然):

ERROR: cannot drop type "my_enum" because other objects depend on it

所以我的问题是如何在不删除整个枚举值的情况下删除其中一个枚举值?我知道只需更改即可轻松添加值:

ALTER TYPE "my_enum" ADD VALUE 'value4';

所以我想我可以在删除时做一些等效的事情。

谢谢!

您必须删除该类型,但是,您可以临时更改 table(s) 包含该类型的列。

示例模型:

create type my_enum as enum('apple', 'pear', 'banana');
create table my_table(id serial primary key, my_col my_enum);
insert into my_table (my_col) values
    ('apple'),
    ('pear');

从枚举类型中删除 banana

alter table my_table alter my_col type text;
drop type my_enum;
create type my_enum as enum('apple', 'pear');
alter table my_table alter my_col type my_enum using my_col::my_enum;

检查:

select * from my_table;

 id | my_col 
----+--------
  1 | apple
  2 | pear
(2 rows)    

嗯,虽然真的不推荐,但如果你有权利的话,还是有办法实现的:

SELECT 
    t.typname,
    e.enumlabel,
    e.enumtypid
FROM pg_type t
JOIN pg_enum e ON e.enumtypid = t.oid
WHERE t.typname = '<your enum name>'

这为您提供枚举类型的 dbms 内部 ID enumtypid

用这个你可以做删除:

DELETE FROM pg_enum
WHERE enumtypid = <your enumtypid>
    AND enumlabel = '<enum value to delete>'

您必须确保在此之前您不再使用该值。否则你 table 可能会腐败!