Renommer l'élément enum dans PostgreSQL

je voudrais changer le nom d'un élément dans un type enum dans PostgreSQL 9.1.5.

Voici le type de créer stmt:

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

je veux juste changer 'tâche créée' en'avorté'. Il semble qu'à partir de la documentation, que la suivante devrait fonctionner:

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

Cependant, je reçois un message d'erreur:

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

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

mais, cela existe clairement.

Le type est actuellement utilisé par plus d'une table.

je suis à penser qu'il ne doit pas être une façon de le faire. J'ai essayé le dialogue pour le type dans pgAdminIII, mais il n'y a aucun moyen que je puisse voir pour renommer l'it là. (Donc, un fort soupçon que je ne peux pas le faire, ou - je l'espère - une petite surveillance de l'être, le développeur qui a créé cette boîte de dialogue)

si Je ne peux pas le faire en une seule phrase? Alors que dois-je faire? Je dois écrire un script pour ajouter un élément, mettez à jour tous les enregistrements de la nouvelle valeur, puis déposez la l'ancien point? Va que même travail?

Il semble que ce devrait être une chose simple. D'après ce que j'ai compris, les dossiers contiennent juste une référence au type et à l'article. Je ne pense pas qu'ils sont réellement stocker la valeur du texte que je lui ai donné. Mais, peut-être que j'ai tort ici aussi.

30
demandé sur David S 2012-09-27 22:26:17

4 réponses

les noms des valeurs enum sont appelés étiquettes, les attributs sont quelque chose de complètement différent.

malheureusement changer les étiquettes d'enum n'est pas simple, vous devez muck avec le catalogue système: 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
répondu Dondi Michael Stroma 2012-09-27 19:04:39

Dans la version de PostgreSQL 10, la possibilité de renommer les étiquettes d'un enum a été ajouté dans le cadre de l' ALTER TYPE syntaxe:

ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
13
répondu cstroe 2017-08-01 18:02:58

la requête dans la réponse acceptée ne prend pas en compte les noms de schéma. Voici un endroit plus sûr (et plus simple), basé sur 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;

notez que cela nécessite la permission" rolcatupdate " (Update catalog directly) - même être un super-utilisateur n'est pas suffisant.

il semble que la mise à jour directe du catalogue soit toujours le seul moyen à partir de PostgreSQL 9.3.

11
répondu EM0 2013-09-13 14:46:08
CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

fait , vous pouvez ajouter valeurs enum.

ALTER TYPE import_action 
ADD VALUE 'Aborted';

mais le diagramme de syntaxe ne montre aucun support pour supprimer ou renommer un valeur. La syntaxe que vous cherchez à est la syntaxe pour renommer un attribut, pas une valeur.

bien que ce design soit peut-être surprenant, il est aussi délibéré. À partir de la pgsql-hackers liste de diffusion.

Si vous avez besoin de modifier les valeurs utilisées ou si vous voulez savoir ce que l'entier utilisez plutôt une table de recherche. Les énums sont la mauvaise abstraction pour vous.

4
répondu Mike Sherrill 'Cat Recall' 2012-09-28 10:42:27