Вы удаляете (отбрасываете) типы перечислений, как и любой другой тип, с помощью 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;
drop type admin_level1
?