小编典典

如何删除 postgres 中的枚举类型值?

all

如何删除我在 postgresql 中创建的枚举类型值?

create type admin_level1 as enum('classifier', 'moderator', 'god');

例如,我想moderator从列表中删除。

我似乎在文档上找不到任何东西。

我正在使用 Postgresql 9.3.4。


阅读 135

收藏
2022-08-20

共1个答案

小编典典

您可以像任何其他类型一样删除(删除)枚举类型,使用DROP TYPE

DROP TYPE admin_level1;

您是否可能实际上是在询问如何 从枚举类型中删除单个值
?如果是这样,你不能。不支持

尽管enum类型主要用于静态值集,但支持向现有枚举类型添加新值以及重命名值(请参阅 参考资料ALTER TYPE)。不能从枚举类型中删除现有值,也不能更改这些值的排序顺序,除非删除并重新创建枚举类型。

您必须创建一个没有值的新类型,将旧类型的所有现有用途转换为使用新类型,然后删除旧类型。

例如

CREATE TYPE admin_level1 AS ENUM ('classifier', 'moderator');

CREATE TABLE blah (
    user_id integer primary key,
    power admin_level1 not null
);

INSERT INTO blah(user_id, power) VALUES (1, 'moderator'), (10, 'classifier');

ALTER TYPE admin_level1 ADD VALUE 'god';

INSERT INTO blah(user_id, power) VALUES (42, 'god');

-- .... oops, maybe that was a bad idea

CREATE TYPE admin_level1_new AS ENUM ('classifier', 'moderator');

-- Remove values that won't be compatible with new definition
-- You don't have to delete, you might update instead
DELETE FROM blah WHERE power = 'god';

-- Convert to new type, casting via text representation
ALTER TABLE blah 
  ALTER COLUMN power TYPE admin_level1_new 
    USING (power::text::admin_level1_new);

-- and swap the types
DROP TYPE admin_level1;

ALTER TYPE admin_level1_new RENAME TO admin_level1;
2022-08-20