PostgreSQL'de yeni bir sütunun konumunu nasıl belirleyebilirim?


74

Sütunları olan bir tablom varsa:

id | name | created_date

ve bir sütun eklemek istiyorum, kullanıyorum:

alter table my_table add column email varchar(255)

Daha sonra sütun, sütundan sonra eklenir created_date.

Yeni sütunun konumunu belirleyebilmemin bir yolu var mı? örneğin sonra ekleyip nameşöyle bir tablo alabilirim:

id | name | email | created_date

4
Bunu yapmana gerek yok. Onları kendi seçtiğiniz ifadeye istediğiniz sırayla yerleştirin.
a_horse_with_no_name

@ jonas böylece aynı viewsırayla bir şov yaratabiliyorsunuz ki ... teknik olarak sütunun konumu onları bir sorguda herhangi bir sırayla tanımlayabileceğiniz gibi önemli olmamalıydı ... ve genellikleselect *
xenoterracide

2
@ a_horse: Sütunların birçok farklı siparişi olduğunda tablolarla çalışmak (geliştirici / yönetici olarak) çok daha zor. Bir tabloda 15 sütun varken, onları tüm veritabanlarında aynı sırada tutmayı tercih ederim.
Jonas,

2
@jonas, ekler ve güncellemeler yaparken sütun adlarını tanımlayabilir ve böylece siparişi alakasız hale getirebilir.
xenoterracide 12:11

2
@Jonas: Ardından sütunları istediğiniz sırayla bildiren kendi alternatifinizi yazın (yalnızca sistem tablolarındaki bir sorgu: psql -Egerçek sorguyu görmek için düğmeyi kullanmayı deneyin )
Jack Douglas

Yanıtlar:


54

ALTER TABLE ADD COLUMNyeni sütunu yalnızca sonuna, sonuncusuna ekleyecektir. Başka bir konumda yeni bir sütun oluşturmak için tabloyu yeniden oluşturmanız ve verileri bu yeni tabloda eski / geçerli tablodan kopyalamanız gerekir.



4
Doğru .. ama bu yöntemi gerçekten kullanan var mı? :-)
Marian

2
Masayı ve tüm çocuk masalarını , yabancı anahtarları ve hibeleri yeniden oluşturmaktan daha kolaysa :) Bağlantının, neden bir konum belirtemediğinize dair bir açıklama sunabileceği ya da bir uygulamada neden uygulanabileceğini açıklamanın bir yolunu sunduğu için bağlantının yararlı olabileceğini düşündüm. gelecekteki sürüm.
Jack Douglas

22

Belirli bir sipariş istiyorsanız, tabloyu yeniden oluşturmanız gerekecektir. Sadece şöyle bir şey yap:

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;

Gerektiği gibi indeksler yaratın.


2

Bunu sadece görünümler için istiyorsanız, istediğiniz tablo sırasına göre her tablo için bir görünüm bulundurmayı daha kolay buluyorum ve tablo yerine bu tablodan birini seçiyorum.

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;

Diğer tüm amaçlar için (insert, union gibi) her zaman sütun listesini belirtmek daha iyidir.

-- 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.