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

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

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

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

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

我正在使用 Postgresql 9.3.4。

解答

您可以像任何其他类型一样删除(删除)枚举类型,使用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;
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐