Wie kann ich die Position für eine neue Spalte in PostgreSQL angeben?

74

Wenn ich eine Tabelle mit den Spalten habe:

id | name | created_date

und möchte eine Spalte hinzufügen, benutze ich:

alter table my_table add column email varchar(255)

Dann wird die Spalte nach der created_dateSpalte hinzugefügt .

Kann ich die Position für die neue Spalte in irgendeiner Weise angeben? zB damit ich es nachher hinzufügen kann nameund eine Tabelle wie folgt bekomme:

id | name | email | created_date
Jonas
quelle
4
Das ist nicht nötig. Fügen Sie sie einfach in der von Ihnen gewünschten Reihenfolge in Ihre select-Anweisung ein.
a_horse_with_no_name
@jonas, Sie können also auch eine viewShow in dieser Reihenfolge erstellen. Technisch gesehen sollte die Position der Spalte keine Rolle spielen, da Sie sie in einer beliebigen Reihenfolge in einer Abfrage definieren könnenselect *
Xenoterracide
2
@a_horse: Nun, es ist viel schwieriger (als Entwickler / Administrator) mit den Tabellen zu arbeiten, wenn die Spalten viele verschiedene Ordnungen haben. Wenn ich 15 Spalten in einer Tabelle habe, ziehe ich es wirklich vor, sie in allen Datenbanken in der gleichen Reihenfolge zu haben.
Jonas
2
@jonas Sie können beim Einfügen und Aktualisieren Spaltennamen definieren und so die Reihenfolge irrelevant machen.
Xenoterracide
2
@Jonas: Dann schreiben Sie Ihre eigene Alternative zu \ d, die die Spalten in der gewünschten Reihenfolge meldet (es handelt sich nur um eine Abfrage in den Systemtabellen: Verwenden Sie den psql -ESchalter, um die tatsächliche Abfrage zu sehen)
Jack Douglas

Antworten:

54

ALTER TABLE ADD COLUMNfügt die neue Spalte nur am Ende als letzte hinzu. Um eine neue Spalte an einer anderen Position zu erstellen, müssen Sie die Tabelle neu erstellen und die Daten aus der alten / aktuellen Tabelle in diese neue Tabelle kopieren.

Marian
quelle
4
Das stimmt .. aber wendet jemand diese Methode wirklich an? :-)
Marian
2
Wenn es einfacher ist, als die Tabelle und alle Kindertabellen , Fremdschlüssel und Zuweisungen neu zu erstellen :) Ich dachte, der Link könnte in beiden Fällen nützlich sein, da er eine Erklärung dafür bietet, warum Sie keine Position angeben können, und hoffen, dass er in a implementiert wird zukünftige Version.
Jack Douglas
22

Sie müssen die Tabelle neu erstellen, wenn Sie eine bestimmte Reihenfolge wünschen. Mach einfach so etwas wie:

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;

Erstellen Sie Indizes nach Bedarf usw.

Scott Marlowe
quelle
2

Wenn Sie dies nur zur Veranschaulichung wünschen, finde ich es einfacher, eine Ansicht für jede Tabelle mit der gewünschten Reihenfolge der Spalten zu behalten und statt der Tabelle eine Auswahl daraus zu treffen.

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;

Für alle anderen Zwecke (wie Einfügen, Vereinigen) ist es besser, immer die Spaltenliste anzugeben.

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