PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como excluir um valor do tipo enum no postgres?


Você exclui (descarta) tipos de enumeração como qualquer outro tipo, com DROP TYPE :
DROP TYPE admin_level1;

É possível que você esteja realmente perguntando sobre como remover um valor individual de um tipo enum ? Se sim, você não pode. Não é suportado:

Embora enum os tipos destinam-se principalmente a conjuntos de valores estáticos, há suporte para adicionar novos valores a um tipo de enumeração existente e para renomear valores (consulte ALTER TYPE ). Os valores existentes não podem ser removidos de um tipo enum, nem a ordem de classificação de tais valores pode ser alterada, a não ser descartar e recriar o tipo enum.

Você deve criar um novo tipo sem o valor, converter todos os usos existentes do tipo antigo para usar o novo tipo e, em seguida, descartar o tipo antigo.

Por exemplo.
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;