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


75

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 la created_datecolonna.

Esiste un modo per specificare la posizione per la nuova colonna? ad esempio, quindi posso aggiungerlo dopo namee ottenere una tabella come:

id | name | email | created_date

4
Non è necessario farlo. Inseriscili nella dichiarazione selezionata nell'ordine desiderato.
a_horse_with_no_name

@jonas in modo da poter creare anche uno viewshow in questo ordine ... tecnicamente la posizione della colonna non dovrebbe avere importanza in quanto puoi definirli in qualsiasi ordine in una query ... e generalmente non dovresti fare unselect *
xenoterracide,

2
@a_horse: Beh, è ​​molto più difficile lavorare (come sviluppatore / amministratore) con le tabelle quando le colonne hanno molti ordini diversi. Quando ho 15 colonne in una tabella, preferisco davvero averle nello stesso ordine in tutti i database.
Jonas,

2
@jonas è possibile definire i nomi delle colonne quando si eseguono inserimenti e aggiornamenti e quindi l'ordine non è rilevante.
xenoterracide,

2
@Jonas: Quindi scrivi la tua alternativa a \ d che riporta le colonne nell'ordine desiderato (è solo una query sulle tabelle di sistema: prova a utilizzare l' psql -Einterruttore per vedere la query effettiva)
Jack Douglas

Risposte:


54

ALTER TABLE ADD COLUMNaggiungerà 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.



4
Esatto .. ma qualcuno usa davvero questo metodo? :-)
Marian,

2
Se è più semplice che ricreare la tabella e tutte le tabelle secondarie , le chiavi esterne e le sovvenzioni :) Ho pensato che il link potesse essere utile in entrambi i casi in quanto offre una spiegazione del perché non è possibile specificare la posizione e sperare che possa essere implementato in un versione futura.
Jack Douglas,

22

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

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.


2

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 insert, 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.