Jak mogę określić pozycję nowej kolumny w PostgreSQL?

74

Jeśli mam tabelę z kolumnami:

id | name | created_date

i chciałbym dodać kolumnę, używam:

alter table my_table add column email varchar(255)

Następnie kolumna jest dodawana za created_datekolumną.

Czy jest jakiś sposób, aby określić pozycję nowej kolumny? np. żebym mógł dodać go później namei uzyskać tabelę:

id | name | email | created_date
Jonas
źródło
4
Nie ma takiej potrzeby. Po prostu umieść je w wybranej instrukcji w kolejności, w jakiej chcesz.
a_horse_w_no_name
@jonas, abyś mógł także utworzyć program, viewktóry jest w tej kolejności ... technicznie pozycja kolumny nie powinna mieć znaczenia, ponieważ możesz zdefiniować je w dowolnej kolejności w zapytaniu ... i generalnie nie powinieneś robićselect *
Xenoterracide
2
@ a_horse: Cóż, znacznie trudniej jest pracować (jako programista / administrator) przy tabelach, gdy kolumny mają wiele różnych zamówień. Kiedy mam 15 kolumn w tabeli, naprawdę wolę mieć je w tej samej kolejności we wszystkich bazach danych.
Jonas
2
@jonas możesz zdefiniować nazwy kolumn podczas wstawiania i aktualizacji, a tym samym sprawić, że kolejność nie będzie miała znaczenia.
Xenoterracide
2
@Jonas: Następnie napisz własną alternatywę dla \ d, która zgłasza kolumny w żądanej kolejności (jest to tylko zapytanie w tabelach systemowych: spróbuj użyć psql -Eprzełącznika, aby zobaczyć rzeczywiste zapytanie)
Jack Douglas

Odpowiedzi:

54

ALTER TABLE ADD COLUMNdoda tylko nową kolumnę na końcu, jako ostatnią. Aby utworzyć nową kolumnę w innej pozycji, musisz ponownie utworzyć tabelę i skopiować dane ze starej / bieżącej tabeli w tej nowej tabeli.

Marian
źródło
4
Zgadza się ... ale czy ktoś naprawdę używa tej metody? :-)
Marian
2
Jeśli jest to łatwiejsze niż odtworzenie tabeli i wszystkich tabel podrzędnych , kluczy obcych i grantów :) Pomyślałem, że link może być przydatny w obu przypadkach, ponieważ zawiera wyjaśnienie, dlaczego nie można określić pozycji i mam nadzieję, że można go zaimplementować w przyszła wersja.
Jack Douglas
22

Musisz odtworzyć tabelę, jeśli chcesz mieć określone zamówienie. Po prostu zrób coś takiego:

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;

Utwórz indeksy zgodnie z potrzebami itp.

Scott Marlowe
źródło
2

Jeśli chcesz tego tylko dla wyglądu, łatwiej jest mi zachować widok dla każdej tabeli z pożądaną kolejnością kolumn i wybrać z niej zamiast tabeli.

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;

Do wszystkich innych celów (takich jak wstawianie, łączenie) lepiej jest zawsze określać listę kolumn.

-- 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
źródło