Saltar al contenido

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

Esta división ha sido aprobado por especialistas para que tengas la seguridad de la veracidad de esta reseña.

Solución:

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

DROP TYPE admin_level1;

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

Aunque enum Los tipos están destinados principalmente a static conjuntos 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.

P.ej

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;

Muy bien escrito aquí:

http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/

cambiar el nombre del tipo existente

ALTER TYPE status_enum RENAME TO status_enum_old;

crear el nuevo tipo

CREATE TYPE status_enum AS ENUM('queued', 'running', 'done');

actualizar las columnas para usar el nuevo tipo

ALTER TABLE job ALTER COLUMN job_status TYPE status_enum USING job_status::text::status_enum;

eliminar el tipo antiguo

DROP TYPE status_enum_old;

Posibles errores y resolución de problemas:

  • invalid input value for enum enum name: "some value" – Una o más filas tienen un valor ("some value") que no está en su nuevo tipo. Debe manejar estas filas antes de poder actualizar el tipo de columna.
  • default for column "column_name" cannot be cast automatically to type enum_name – El valor predeterminado para la columna no está en su nuevo tipo. Debe cambiar o eliminar el valor predeterminado de la columna antes de poder actualizar el tipo de columna. Gracias a Philipp por esta adición.

Si desea eliminar un elemento del tipo de enumeración, debe operar en la tabla del sistema de PostgreSQL.

Con este comando, puede mostrar todo el tipo de enumeración de elementos.

SELECCIONE * DESDE pg_enum;

Luego verifique que el valor buscado sea único. Para aumentar la unicidad durante la eliminación de rekoru, se debe pasar ‘enumtypid’ además de ‘enumlabel’.

Este comando elimina la entrada en el tipo de enumeración, donde ‘único’ es su valor.

DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel=’unique’;

NOTA
Se debe usar el ejemplo que describí, cuando por casualidad agregamos un nuevo valor al tipo de enumeración y, sin embargo, no lo hemos usado en ninguna parte de la base de datos.

Tienes la opción de añadir valor a nuestra información añadiendo tu veteranía en los comentarios.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *