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.