Cambiar el nombre del elemento enum en PostgreSQL


Me gustaría cambiar el nombre de un elemento en un tipo de enumeración en PostgreSQL 9.1.5.

Aquí está el tipo create stmt:

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

Solo quiero cambiar 'Tarea creada' a 'Abortada'. Parece que de la documentación , que lo siguiente debería funcionar:

ALTER TYPE import_action
RENAME ATTRIBUTE "Task created" TO "Aborted"; 

Sin embargo, obtengo un mensaje:

********** Error **********

ERROR: relation "import_action" does not exist
SQL state: 42P01

Pero, claramente existe.

El tipo está siendo utilizado actualmente por más de una tabla.

Estoy pensando que no debe haber una manera para hacer esto. He intentado el diálogo para el tipo en pgAdminIII, pero no hay manera de que pueda ver para cambiar el nombre de la que allí. (Por lo tanto, o bien una fuerte pista de que no puedo hacerlo, o - espero - un pequeño descuido ser el desarrollador que creó ese diálogo)

Si no puedo hacer esto en una declaración? ¿Entonces qué tengo que hacer? ¿Tendré que escribir un script para agregar el elemento, actualizar todos los registros a un nuevo valor y luego eliminar el elemento anterior? ¿Eso funcionará?

Parece que esto debería ser una cosa simple. Según entiendo, los registros solo almacenan una referencia al tipo y al elemento. No creo que sean realmente almacenar el valor de texto que le he dado. Pero, tal vez estoy equivocado aquí también.

Author: David S, 2012-09-27

4 answers

Los nombres de los valores de enumeración se llaman etiquetas, los atributos son algo completamente diferente.

Desafortunadamente cambiar las etiquetas de enumeración no es simple, tiene que hacer muck con el catálogo del sistema: http://www.postgresql.org/docs/9.1/static/catalog-pg-enum.html

UPDATE pg_enum SET enumlabel = 'Aborted' 
WHERE enumlabel = 'Task created' AND enumtypid = (
  SELECT oid FROM pg_type WHERE typname = 'import_action'
)
 28
Author: Dondi Michael Stroma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-27 19:04:39

En PostgreSQL versión 10, la capacidad de renombrar las etiquetas de una enumeración se ha agregado como parte de la sintaxis ALTER TYPE:

ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
 13
Author: cstroe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 18:02:58

La consulta en la respuesta aceptada no tiene en cuenta los nombres de esquema. Aquí hay uno más seguro (y más simple), basado en http://tech.valgog.com/2010/08/alter-enum-in-postgresql.html

UPDATE pg_catalog.pg_enum
SET enumlabel = 'NEW_LABEL'
WHERE enumtypid = 'SCHEMA_NAME.ENUM_NAME'::regtype::oid AND enumlabel = 'OLD_LABEL'
RETURNING enumlabel;

Tenga en cuenta que esto requiere el permiso "rolcatupdate" (Actualizar catálogo directamente) - incluso ser un superusuario no es suficiente.

Parece que actualizar el catálogo directamente sigue siendo la única forma a partir de PostgreSQL 9.3.

 11
Author: EM0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 14:46:08

Hay una diferencia entre tipos, atributos y valores. Puedes crear una enumeración como esta.

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

Habiendo hecho que, puede agregar valores a la enumeración.

ALTER TYPE import_action 
ADD VALUE 'Aborted';

Pero el diagrama de sintaxis no muestra ningún soporte para eliminar o cambiar el nombre de un valor . La sintaxis que estabas buscando era la sintaxis para renombrar un atributo, no un valor.

Aunque este diseño es quizás sorprendente, también es deliberado. Desde el pgsql-hackers mailing list .

Si necesita modificar los valores utilizados o quiere saber lo que el entero es, utilice una tabla de búsqueda en su lugar. Los enums son la abstracción equivocada para usted.

 4
Author: Mike Sherrill 'Cat Recall',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-28 10:42:27