web-dev-qa-db-fra.com

Comment modifier la position d'une colonne dans une table de base de données PostgreSQL?

J'ai essayé ce qui suit, mais j'ai échoué:

ALTER TABLE person ALTER COLUMN dob POSITION 37;
96
Huuuze

" Modifier la position de la colonne " dans le wiki de PostgreSQL:

PostgreSQL définit actuellement l’ordre des colonnes en fonction de la colonne attnum de la colonne pg_attribute table. Le seul moyen de modifier l'ordre des colonnes consiste à recréer le tableau ou à ajouter des colonnes et à faire pivoter les données jusqu'à atteindre la présentation souhaitée.

C'est assez faible, mais pour leur défense, en SQL standard, il n'y a pas non plus de solution pour repositionner une colonne. Les marques de base de données prenant en charge la modification de la position ordinale d'une colonne définissent une extension à la syntaxe SQL.

Une autre idée m'est venue à l’esprit: vous pouvez définir un VIEW qui spécifie l’ordre des colonnes à votre guise, sans modifier la position physique de la colonne dans la table de base.

91
Bill Karwin

Ce message est ancien et probablement résolu, mais j'avais le même problème. Je l'ai résolu en créant une vue de la table d'origine en spécifiant le nouvel ordre des colonnes.

À partir de là, je pourrais utiliser la vue ou créer une nouvelle table à partir de la vue.

 CREATE VIEW original_tab_vw AS 
 SÉLECTIONNER a.col1, a.col3, a.col4, a.col2 
 À PARTIR DE original_tab a 
 WHERE a.col1 IS PAS NULL - ou quoi que ce soit 
 SELECT * IN new_table FROM original_tab_vw 

Renommez ou supprimez la table d'origine et définissez le nom de la nouvelle table sur l'ancienne.

25
Ken

Une option, bien que maladroite, pour réorganiser les colonnes lorsque l’ordre des colonnes doit impérativement être modifié et que les clés étrangères sont utilisées, consiste tout d’abord à vider toute la base de données avec les données, puis à vider uniquement le schéma (pg_dump -s databasename > databasename_schema.sql). Ensuite, éditez le fichier de schéma pour réorganiser les colonnes comme vous le souhaitez, puis recréez la base de données à partir du schéma, puis restaurez les données dans la base de données nouvellement créée.

19
Ville

Dans PostgreSQL, lors de l'ajout d'un champ, il serait ajouté à la fin de la table. Si nous devons insérer dans une position particulière alors

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
16
Allwin

Je ne pense pas que vous puissiez actuellement: voir cet article sur le wiki Postgresql .

Les trois solutions de contournement de cet article sont les suivantes:

  1. Recréer la table
  2. Ajouter des colonnes et déplacer des données
  3. Masquer les différences avec une vue.
8
Mike Woodhouse

Ouvrez la table dans PGAdmin et dans le volet SQL situé en bas, copiez l'instruction SQL Create Table. Ouvrez ensuite l'éditeur de requêtes et collez-le. Si la table contient des données, remplacez le nom de la table par 'nouveau_nom', sinon, supprimez le commentaire "-" dans la ligne Supprimer la table. Editez la séquence de colonnes selon vos besoins. Attention à la virgule manquante/superflue dans la dernière colonne au cas où vous l’auriez déplacée. Exécutez la nouvelle commande SQL Create Table. Actualisez et ... voilà.

Pour les tables vides au stade de la conception, cette méthode est très pratique.

Si la table contient des données, nous devons également réorganiser la séquence de colonnes des données. C'est simple: utilisez INSERT pour importer l'ancienne table dans sa nouvelle version avec:

INSERT INTO new ( c2, c3, c1 ) SELECT * from old;

... où c2, c3, c1 sont les colonnes c1, c2, c3 de l'ancienne table dans leurs nouvelles positions. Veuillez noter que dans ce cas, vous devez utiliser un "nouveau" nom pour la "vieille" table modifiée, ou vous perdrez vos données. Si les noms de colonne sont nombreux, longs et/ou complexes, utilisez la même méthode que ci-dessus pour copier la nouvelle structure de table dans un éditeur de texte et créez-y la nouvelle liste de colonnes avant de la copier dans l'instruction INSERT.

Après avoir vérifié que tout va bien, DROP l'ancienne table et remplacez le 'nouveau' nom par 'ancien' à l'aide de ALTER TABLE new RENAME TO old; et vous avez terminé.

5
marcopolo

J'utilise Django et il faut une colonne id dans chaque table si vous ne voulez pas avoir mal à la tête. Malheureusement, j'ai été négligent et ma table bp.geo_location_vague ne contenait pas ce champ. I petit truc initialé Étape 1:

CREATE VIEW bp.geo_location_vague_vw AS
    SELECT 
        a.id, -- I change order of id column here. 
        a.in_date,
        etc
    FROM bp.geo_location_vague a

Etape 2: (sans créer table - table créera automatiquement!)

SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw

Étape 3:

CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;

Parce que j'ai besoin d'avoir un pseudotype bigserial dans la table. Après SELECT * dans pg créera le type bigint insetad bigserial.

étape 4: Maintenant, nous pouvons supprimer la vue, supprimer la table source et renommer la nouvelle table avec l'ancien nom. L'astuce s'est terminée avec succès.

0
Orlov Const