it-swarm-eu.dev

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

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 dem created_date Säule.

Kann ich die Position für die neue Spalte auf irgendeine Weise angeben? z.B. so kann ich es nach name hinzufügen und eine Tabelle wie folgt erhalten:

id | name | email | created_date
85
Jonas

ALTER TABLE ADD COLUMN fügt nur die neue Spalte 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.

62
Marian

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 nach Bedarf Indizes usw.

24
Scott Marlowe

Wenn Sie dies nur für das Aussehen wünschen, fällt es mir leichter, eine Ansicht für jede Tabelle mit der gewünschten Reihenfolge der Spalten beizubehalten und anstelle 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);
3