Bagaimana saya bisa menentukan posisi untuk kolom baru di PostgreSQL?

74

Jika saya memiliki tabel dengan kolom:

id | name | created_date

dan ingin menambahkan kolom, saya menggunakan:

alter table my_table add column email varchar(255)

Kemudian kolom ditambahkan setelah created_datekolom.

Apakah ada cara saya dapat menentukan posisi untuk kolom baru? misalnya jadi saya bisa menambahkannya setelah itu namedan mendapatkan tabel seperti:

id | name | email | created_date
Jonas
sumber
4
Tidak perlu melakukan itu. Masukkan saja ke dalam pernyataan pilih Anda sesuai urutan yang Anda inginkan.
a_horse_with_no_name
@jonas sehingga Anda juga bisa membuat viewacara itu dalam urutan itu ... secara teknis posisi kolom tidak menjadi masalah karena Anda dapat mendefinisikannya dalam urutan apa pun dalam kueri ... dan Anda biasanya tidak boleh melakukanselect *
xenoterracide
2
@ a_horse: Yah, jauh lebih sulit untuk bekerja (sebagai pengembang / admin) dengan tabel ketika kolom memiliki banyak pesanan berbeda. Ketika saya memiliki 15 kolom dalam sebuah tabel saya benar-benar lebih suka memilikinya dalam urutan yang sama di semua database.
Jonas
2
@jonas, Anda dapat menentukan nama kolom saat melakukan penyisipan dan pembaruan dan karenanya membuat pesanan tidak relevan.
xenoterracide
2
@Jonas: Lalu tulis alternatif Anda sendiri yang melaporkan kolom dalam urutan yang Anda inginkan (itu hanya kueri pada tabel sistem: coba gunakan psql -Esakelar untuk melihat kueri yang sebenarnya)
Jack Douglas

Jawaban:

54

ALTER TABLE ADD COLUMNhanya akan menambahkan kolom baru di akhir, sebagai yang terakhir. Untuk membuat kolom baru di posisi lain, Anda perlu membuat ulang tabel dan menyalin data dari tabel lama / saat ini di tabel baru ini.

Marian
sumber
4
Itu benar .. tetapi adakah yang benar-benar menggunakan metode ini? :-)
Marian
2
Jika lebih mudah daripada menciptakan ulang tabel dan semua tabel anak - anak , kunci asing dan hibah :) Saya pikir tautannya mungkin bermanfaat karena menawarkan penjelasan mengapa Anda tidak dapat menentukan posisi dan berharap bahwa itu dapat diimplementasikan dalam versi masa depan.
Jack Douglas
22

Anda harus membuat ulang tabel jika Anda menginginkan pesanan tertentu. Lakukan sesuatu seperti:

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;

Buat indeks sesuai kebutuhan dll.

Scott Marlowe
sumber
2

Jika Anda menginginkan ini hanya untuk penampilan, saya merasa lebih mudah untuk menjaga tampilan per setiap tabel dengan urutan kolom yang diinginkan, dan memilih dari itu daripada tabel.

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;

Untuk semua tujuan lain (seperti menyisipkan, penyatuan) lebih baik untuk selalu menentukan daftar kolom.

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