Comment puis-je spécifier la position d'une nouvelle colonne dans PostgreSQL?

75

Si j'ai une table avec les colonnes:

id | name | created_date

et voudrais ajouter une colonne, j'utilise:

alter table my_table add column email varchar(255)

Ensuite, la colonne est ajoutée après la created_datecolonne.

Est-il possible de spécifier la position de la nouvelle colonne? par exemple pour que je puisse l'ajouter après nameet obtenir un tableau du type:

id | name | email | created_date
Jonas
la source
4
Il n'y a pas besoin de faire ça. Il suffit de les mettre dans votre déclaration select dans l'ordre que vous souhaitez.
a_horse_with_no_name
@jonas afin que vous puissiez également créer une viewémission correspondante dans cet ordre ... techniquement, la position de la colonne ne devrait pas avoir d'importance, car vous pouvez les définir dans n'importe quel ordre dans une requête ... et vous ne devriez généralement pas faire deselect *
Xenoterracide
2
@a_horse: Eh bien, il est beaucoup plus difficile de travailler (en tant que développeur / administrateur) avec les tables lorsque les colonnes ont de nombreux ordres différents. Quand j'ai 15 colonnes dans un tableau, je préfère vraiment les avoir dans le même ordre dans toutes les bases de données.
Jonas
2
@jonas vous pouvez définir des noms de colonne lors de l'insertion et de la mise à jour, rendant ainsi l'ordre sans objet.
Xenoterracide
2
@Jonas: Ensuite, écrivez votre propre alternative à \ d qui rapporte les colonnes dans l'ordre de votre choix (il ne s'agit que d'une requête sur les tables système: essayez d'utiliser le psql -Ecommutateur pour afficher la requête réelle)
Jack Douglas

Réponses:

54

ALTER TABLE ADD COLUMNajoutera seulement la nouvelle colonne à la fin, en tant que dernière. Afin de créer une nouvelle colonne dans une autre position, vous devez recréer la table et copier les données de l'ancienne table / actuelle dans cette nouvelle table.

Marian
la source
4
C'est vrai .. mais est-ce que quelqu'un utilise vraiment cette méthode? :-)
Marian
2
S'il est plus facile que de recréer la table et toutes les tables enfants , clés étrangères et allocations :) version future.
Jack Douglas
22

Vous devrez recréer la table si vous souhaitez un certain ordre. Faites juste quelque chose comme:

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

Créez des index selon vos besoins, etc.

Scott Marlowe
la source
2

Si vous ne voulez que cela pour l'apparence, il est plus facile de garder une vue pour chaque table avec l'ordre souhaité des colonnes et de la sélectionner à la place de la table.

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;

Pour tous les autres objectifs (comme insérer, union), il est préférable de toujours spécifier la liste des colonnes.

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);
Simon Perepelitsa
la source