it-swarm.it

Come posso specificare la posizione per una nuova colonna in PostgreSQL?

Se ho una tabella con le colonne:

id | name | created_date

e vorrei aggiungere una colonna, io uso:

alter table my_table add column email varchar(255)

Quindi la colonna viene aggiunta dopo il created_date colonna.

Esiste un modo per specificare la posizione per la nuova colonna? per esempio. così posso aggiungerlo dopo name e ottenere una tabella come:

id | name | email | created_date
85
Jonas

ALTER TABLE ADD COLUMN aggiungerà solo la nuova colonna alla fine, come l'ultima. Per creare una nuova colonna in un'altra posizione, è necessario ricreare la tabella e copiare i dati dalla tabella precedente/corrente in questa nuova tabella.

62
Marian

Dovrai ricreare la tabella se desideri un determinato ordine. Fai qualcosa del tipo:

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;

Crea indici secondo necessità ecc.

24
Scott Marlowe

Se vuoi questo solo per l'aspetto, trovo più facile mantenere una vista per ogni tabella con l'ordine desiderato di colonne e selezionarlo da esso invece della tabella.

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;

Per tutti gli altri scopi (come inserire, unione) è meglio specificare sempre l'elenco di colonne.

-- 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