0 votes

PostgreSQL v7.4 ALTER TABLE pour changer de colonne

J'ai besoin de modifier la longueur des colonnes CHAR dans les tables d'une base de données PostgreSQL v7.4. Cette version ne permet pas de modifier directement le type ou la taille des colonnes à l'aide de l'instruction ALTER TABLE. Ainsi, modifier directement une colonne de CHAR(10) à CHAR(20) par exemple n'est pas possible (oui, je sais, "utiliser des varchars", mais ce n'est pas une option dans ma situation actuelle). Je ne sais pas si vous avez des conseils ou des astuces sur la meilleure façon d'y parvenir. Mes premières réflexions :

-- Sauvegarder les données de la table dans une nouvelle table "save". CREATE TABLE save_data AS SELECT * FROM table_to_change ;

-- Supprimer les colonnes à partir de la première colonne à modifier. ALTER TABLE table_to_change DROP nom_colonne1 ; -- pour chaque colonne en commençant par la première qui doit être modifiée ALTER TABLE table_to_change DROP nom_colonne2 ; ...

-- Ajoutez les colonnes, en utilisant la nouvelle taille de la colonne CHAR ALTER TABLE table_to_change ADD column_name1 CHAR(new_size) ; -- pour chaque colonne supprimée ci-dessus ALTER TABLE table_to_change ADD column_name2...

-- Copier la base de données de la table "save". UPDATE table_to_change SET column_name1=save_data.column_name1, -- pour chaque colonne supprimée/lue ci-dessus column_name2=save_date.column_name2, ... FROM save_data WHERE table_to_change.primary_key=save_data.primay_key ;

Beurk ! J'espère qu'il y a une meilleure solution ? Toutes les suggestions sont les bienvenues. Merci d'avance.

2voto

Graham Points 364

Pas dans PostgreSQL, mais dans Oracle, j'ai changé le type d'une colonne par :

  1. Ajouter une nouvelle colonne avec un nom temporaire (ex : TMP_COL ) et le nouveau type de données (ie : CHAR(20 ))
  2. exécuter une requête de mise à jour : UPDATE TBL SET TMP_COL = OLD_COL;
  3. Chute OLD_COL
  4. Renommer TMP_COL a OLD_COL

1voto

Nate C-K Points 3749

Je viderais le contenu de la table dans un fichier plat avec COPY, je supprimerais la table, je la recréerais avec la bonne configuration de colonnes, puis je la rechargerais (avec COPY à nouveau).

http://www.postgresql.org/docs/7.4/static/sql-copy.html

Est-il acceptable d'avoir un temps d'arrêt pendant l'exécution de cette opération ? Il est évident que ce que je viens de décrire nécessite de rendre la table inutilisable pendant un certain temps, dont la durée dépend de la taille des données et du matériel avec lequel vous travaillez.

Editer : Mais COPY est beaucoup plus rapide que les INSERTs et UPDATEs. D'après la documentation, vous pouvez la rendre encore plus rapide en utilisant le mode BINAIRE. BINARY le rend moins compatible avec d'autres installations de PGSQL mais vous ne vous en souciez pas car vous voulez seulement charger les données dans la même instance que celle à partir de laquelle vous les avez vidées.

1voto

La meilleure façon de résoudre votre problème est de mettre à jour pg vers quelque chose de moins archaïque :)

Sérieusement. La version 7.4 va bientôt être retirée des "versions supportées", donc je n'attendrais pas que cela se produise avec la version 7.4 en production.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X