sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo eliminar un valor de tipo de enumeración en postgres?

Elimina (solta) tipos de enumeración como cualquier otro tipo, con DROP TYPE :

DROP TYPE admin_level1;

¿Es posible que en realidad esté preguntando cómo eliminar un valor individual de un tipo de enumeración? ? Si es así, no puedes. No es compatible:

Aunque enum tipos están pensados ​​principalmente para conjuntos estáticos de valores, hay soporte para agregar nuevos valores a un tipo de enumeración existente y para cambiar el nombre de los valores (ver ALTER TYPE ). Los valores existentes no se pueden eliminar de un tipo de enumeración, ni se puede cambiar el orden de clasificación de dichos valores, salvo descartar y volver a crear el tipo de enumeración.

Debe crear un tipo nuevo sin el valor, convertir todos los usos existentes del tipo anterior para usar el tipo nuevo y luego descartar el tipo anterior.

Por ejemplo

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;