web-dev-qa-db-fra.com

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

Si j'ai un tableau avec les colonnes:

id | name | created_date

et je voudrais ajouter une colonne, j'utilise:

alter table my_table add column email varchar(255)

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

Existe-t-il un moyen de spécifier la position de la nouvelle colonne? par exemple. donc je peux l'ajouter après name et obtenir un tableau comme:

id | name | email | created_date
85
Jonas

ALTER TABLE ADD COLUMN ajoutera uniquement la nouvelle colonne à la fin, comme la 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 la table ancienne/actuelle dans cette nouvelle table.

62
Marian

Vous devrez recréer la table si vous souhaitez une certaine commande. 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.

24
Scott Marlowe

Si vous le souhaitez uniquement pour l'apparence, je trouve plus facile de conserver une vue pour chaque table avec l'ordre de colonnes souhaité, et de le 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;

À toutes autres fins (comme insert, 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);
3
Simon Perepelitsa