Comment supprimer une valeur de type enum que j'ai créée dans postgresql?
create type admin_level1 as enum('classifier', 'moderator', 'god');
Par exemple, je souhaite supprimer moderator
de la liste.
Je n'arrive pas à trouver quoi que ce soit sur la documentation.
J'utilise Postgresql 9.3.4.
postgresql
enums
Amjith
la source
la source
drop type admin_level1
?create xxx
il y a undrop xxx
Réponses:
Vous supprimez (supprimez) les types d'énumérations comme tout autre type, avec
DROP TYPE
:Est-il possible que vous vous demandiez comment supprimer une valeur individuelle d'un type enum ? Si oui, vous ne pouvez pas. Ce n'est pas pris en charge :
Vous devez créer un nouveau type sans la valeur, convertir toutes les utilisations existantes de l'ancien type pour utiliser le nouveau type, puis supprimer l'ancien type.
Par exemple
la source
(psycopg2.InternalError) ALTER TYPE ... ADD cannot run inside a transaction block
Très bien écrit ici:
http://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
renommer le type existant
créer le nouveau type
mettre à jour les colonnes pour utiliser le nouveau type
supprimer l'ancien type
la source
Si vous voulez supprimer un élément de type enum, vous devez opérer sur la table système de PostgreSQL.
Avec cette commande, vous pouvez afficher tous les éléments de type énumération.
SELECT * FROM pg_enum;
Vérifiez ensuite que la valeur recherchée est unique. Pour augmenter l'unicité lors de la suppression de rekoru, il faut passer «enumtypid» en plus de «enumlabel».
Cette commande supprime l'entrée de type enum, où «unique» est votre valeur.
DELETE FROM pg_enum fr WHERE en.enumtypid = 124 AND en.enumlabel = 'unique';
REMARQUE L'exemple que j'ai décrit doit être utilisé, quand par hasard nous ajoutons une nouvelle valeur au type enum, et pourtant nous ne l'avons utilisé nulle part dans la base de données.
la source
ERROR: invalid internal value for enum
et ne donnera AUCUN résultat.)DELETE FROM pg_enum en WHERE en.enumtypid=124 AND en.enumlabel='unigue';
la NOTE doit être en gras, pas la commande. Si vous avez utilisé la valeur dans une table, vous ne pouvez pas en récupérer. Vous ne pouvez pas mettre à jour les lignes qui contiennent la valeur, vous ne pouvez pas convertir. Le seul moyen est de supprimer la ligne entière.Pour ceux qui souhaitent modifier les valeurs d'énumération, la recréer semble être la seule solution viable et sûre.
Il consiste à convertir temporairement la colonne enum en un format de chaîne, à recréer l'énumération puis à reconvertir la colonne de chaîne au type enum.
Voici un exemple:
la source
ALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_enum_name::your_schema.your_column;
devrait êtreALTER TABLE your_schema.your_table ALTER COLUMN your_column TYPE your_schema.your_enum_name USING your_schema.your_column::your_enum_name;
Utilisez la requête suivante pour supprimer la valeur ENUM du type PostgreSQL
Juste des informations sur le type et la valeur
Vous devez changer les valeurs existantes en autre. Pour cela, si vous avez besoin d'ajouter une nouvelle valeur, utilisez:
Avant de supprimer, mettez à jour la valeur du type avec une nouvelle valeur de type ou une valeur existante.
la source
SELECT oid FROM pg_type WHERE typname = 'enum_type'
La manière programmatique de le faire est la suivante. Les mêmes étapes générales que celles indiquées dans https://stackoverflow.com/a/47305844/629272 sont appropriées, mais elles sont plus manuelles que sensées pour mes besoins (écrire une migration vers le bas d'alambic).
my_type
,my_type_old
etvalue_to_delete
, devrait, bien entendu, être modifié le cas échéant.Renommez votre type.
Créez un nouveau type avec les valeurs de votre ancien type, à l'exclusion de celui que vous souhaitez supprimer.
Modifiez toutes les colonnes existantes qui utilisent l'ancien type pour utiliser le nouveau.
Supprimez l'ancien type.
la source
si votre jeu de données n'est pas si grand, vous pouvez effectuer un vidage en
--column-inserts
éditant le vidage avec un éditeur de texte, en supprimant la valeur et en réimportant le vidagela source
Eu le même problème dans la v.10. postgres. La suppression nécessite certaines procédures, et si la séquence n'est pas correcte, il y aura même une chance que la table soit verrouillée pour la lecture.
Écrit un script pratique à supprimer. Déjà prouvé plusieurs fois ses performances. Cependant, cette procédure implique de remplacer la valeur supprimée par une nouvelle (elle peut être NULL si le champ de table le permet).
Pour l'utiliser, il vous suffit de renseigner 3 valeurs.
la source
Il n'est pas possible de supprimer une valeur individuelle d'ENUM, la seule solution possible est de DROP et de recréer ENUM avec les valeurs nécessaires.
la source
DELETE FROM pg_enum WHERE enumlabel='saml' AND enumsortorder=4;