J'ai essayé ce qui suit, mais je n'ai pas réussi:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
J'ai essayé ce qui suit, mais je n'ai pas réussi:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Réponses:
" Modifier la position de la colonne " dans le wiki PostgreSQL dit:
PostgreSQL définit actuellement l'ordre des colonnes en fonction de la
attnum
colonne de lapg_attribute
table. La seule façon de modifier l'ordre des colonnes consiste soit à recréer le tableau, soit à ajouter des colonnes et à faire pivoter les données jusqu'à ce que vous atteigniez la disposition 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 qui prennent en charge la modification de la position ordinale d'une colonne définissent une extension de la syntaxe SQL.
Une autre idée me vient à l'esprit: vous pouvez définir un VIEW
qui spécifie l'ordre des colonnes comme vous l'aimez, sans changer la position physique de la colonne dans la table de base.
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;
Ce message est ancien et probablement résolu mais j'ai eu le même problème. Je l'ai résolu en créant une vue de la table d'origine spécifiant le nouvel ordre des colonnes.
De là, je pourrais utiliser la vue ou créer une nouvelle table à partir de la vue.
CRÉER UNE VUE original_tab_vw AS SELECT a.col1, a.col3, a.col4, a.col2 FROM original_tab a O a.col1 N'EST PAS NULL - ou quoi que ce soit
SELECT * INTO 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 table.
Une option, bien que maladroite, pour réorganiser les colonnes lorsque l'ordre des colonnes doit absolument être changé et que des clés étrangères sont utilisées, consiste à d'abord vider la base de données entière avec les données, puis à vider uniquement le schéma ( pg_dump -s databasename > databasename_schema.sql
). Modifiez ensuite 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 et restaurez enfin les données dans la base de données nouvellement créée.
Je ne pense pas que vous le puissiez pour le moment: voir cet article sur le wiki PostgreSQL .
Les trois solutions de contournement de cet article sont:
Ouvrez la table dans PGAdmin et dans le volet SQL en bas, copiez l'instruction SQL Create Table. Ensuite, ouvrez l'éditeur de requêtes et collez. Si la table contient des données, remplacez le nom de la table par «nouveau_nom», sinon supprimez le commentaire «-» dans la ligne Drop Table. Modifiez la séquence de colonnes selon vos besoins. Faites 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. Rafraîchissez-vous et ... voilà.
Pour les tables vides au stade de la conception, cette méthode est assez pratique.
Si la table contient des données, nous devons également réorganiser la séquence des 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 la vieille table dans leurs nouvelles fonctions. Veuillez noter que dans ce cas, vous devez utiliser un «nouveau» nom pour la table «ancienne» modifiée, sinon vous perdrez vos données . Dans le cas où les noms de colonnes 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' INSERT
instruction.
Après avoir vérifié que tout va bien, DROP
utilisez l'ancienne table et changez le nom «nouveau» en «ancien» ALTER TABLE new RENAME TO old;
et vous avez terminé.
Je travaillais à réorganiser de nombreuses tables et je ne voulais pas avoir à écrire les mêmes requêtes encore et encore, alors j'ai créé un script pour tout faire pour moi. Essentiellement, il:
pg_dump
pg_dump
requête d' origine pour créer une table réorganisée avec des donnéesIl peut être utilisé en exécutant la commande simple suivante:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Il imprime le sql afin que vous puissiez le vérifier et le tester, c'est une grande raison sur laquelle je l'ai basé pg_dump
. Vous pouvez trouver le dépôt github ici .
J'utilise Django et il nécessite une colonne id dans chaque table si vous ne voulez pas avoir mal à la tête. Malheureusement, j'étais imprudent et ma table bp.geo_location_vague ne contenait pas ce champ. J'ai paraphé un petit truc. É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
Étape 2: (sans créer de table - la table se 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'un pseudotype bigserial dans le tableau. Après SELECT * dans pg, vous créerez le type bigint insetad bigserial.
étape 4: Nous pouvons maintenant 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.
Il existe quelques solutions de contournement pour rendre cela possible:
Recréer toute la table
Créer de nouvelles colonnes dans la table actuelle
Créer une vue