¿Cómo elimino un valor de tipo de enumeración que creé en postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Por ejemplo, quiero eliminar moderator
de la lista.
Parece que no puedo encontrar nada en los documentos.
Estoy usando Postgresql 9.3.4.
postgresql
enums
Amjith
fuente
fuente
drop type admin_level1
?create xxx
hay undrop xxx
Respuestas:
Elimina (suelta) tipos de enumeración como cualquier otro tipo, con
DROP TYPE
:¿Es posible que esté preguntando cómo eliminar un valor individual de un tipo de enumeración ? Si es así, no puede. No es compatible :
Debe crear un nuevo tipo sin el valor, convertir todos los usos existentes del tipo anterior para usar el nuevo tipo y luego eliminar el tipo anterior.
P.ej
fuente
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Muy bien escrito aquí:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
cambiar el nombre del tipo existente
crea el nuevo tipo
actualice las columnas para usar el nuevo tipo
eliminar el tipo antiguo
fuente
Si desea eliminar el elemento de tipo enumeración, debe operar en la tabla del sistema de PostgreSQL.
Con este comando, puede mostrar todos los elementos del tipo de enumeración.
SELECCIONAR * DE 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.
BORRAR DE pg_enum en DONDE en.enumtypid = 124 Y en.enumlabel = 'único';
NOTA El ejemplo que describí debe usarse, cuando por casualidad agregamos un nuevo valor al tipo de enumeración, y aún no lo hemos usado en ninguna parte de la base de datos.
fuente
ERROR: invalid internal value for enum
y producirá NO resultados).DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
la NOTA debe estar en NEGRITA, no el comando. Si ha utilizado el valor en alguna tabla, no podrá recuperarse de él. No puede actualizar las filas que contienen el valor, no puede convertir. La única forma es eliminar toda la fila.Para aquellos que deseen modificar los valores de enumeración, recrearlos parece ser la única solución viable y segura.
Consiste en convertir temporalmente la columna de enumeración a un formato de cadena, recrear la enumeración y luego reconvertir la columna de cadena al tipo de enumeración.
Aquí hay un ejemplo:
fuente
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
debería serALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Utilice la siguiente consulta para eliminar el valor ENUM del tipo Postgresql
Solo información sobre el tipo y el valor
Debería cambiar los valores existentes a otros. Para eso, si necesita agregar un nuevo valor, use:
Antes de eliminar, actualice el valor de tipo a un nuevo valor de tipo o valor existente.
fuente
SELECT oid FROM pg_type WHERE typname = 'enum_type'
La forma programática de hacer esto es la siguiente. Los mismos pasos generales que se dan en https://stackoverflow.com/a/47305844/629272 son apropiados, pero son más manuales que lógicos para mis propósitos (escribir una migración descendente de alambique).
my_type
,my_type_old
yvalue_to_delete
, por supuesto, debería cambiarse según corresponda.Cambie el nombre de su tipo.
Cree un nuevo tipo con los valores de su tipo anterior, excluyendo el que desea eliminar.
Cambie todas las columnas existentes que usan el tipo antiguo por el nuevo.
Elimina el tipo antiguo.
fuente
si su conjunto de datos no es tan grande, puede volcar con
--column-inserts
editar el volcado con un editor de texto, eliminar el valor y volver a importar el volcadofuente
Tuve el mismo problema en el v.10. postgres. La eliminación requiere ciertos procedimientos y, si la secuencia no es correcta, incluso habrá una posibilidad de que la tabla se bloquee para su lectura.
Escribió un guión conveniente para eliminar. Ya probado varias veces su rendimiento. Sin embargo, este procedimiento implica reemplazar el valor eliminado por uno nuevo (puede ser NULO si el campo de la tabla lo permite).
Para usarlo, solo necesita completar 3 valores.
fuente
No es posible eliminar un valor individual de ENUM, la única solución posible es DROP y volver a crear ENUM con los valores necesarios.
fuente
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;