Aşağıdakileri denedim ama başarısız oldum:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Aşağıdakileri denedim ama başarısız oldum:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
Yanıtlar:
" Alter sütun pozisyon PostgreSQL Wiki" diyor:
PostgreSQL şu anda sütun sırasını tablonun
attnum
sütununa göre tanımlamaktadırpg_attribute
. Sütun sırasını değiştirmenin tek yolu, tabloyu yeniden oluşturmak veya istediğiniz düzene ulaşana kadar sütunlar ekleyip verileri döndürmektir.
Bu oldukça zayıf, ancak onların savunmasında, standart SQL'de bir sütunun yeniden konumlandırılması için de bir çözüm yoktur. Bir sütunun sıralı konumunu değiştirmeyi destekleyen veritabanı markaları, SQL sözdizimine bir uzantı tanımlıyor.
Aklıma başka bir fikir geliyor: VIEW
Temel tablodaki sütunun fiziksel konumunu değiştirmeden, sütunların sırasını istediğiniz gibi belirten bir tanımlayabilirsiniz .
PostgreSQL'de, bir alan eklenirken tablonun sonuna eklenir. Belirli bir konuma eklememiz gerekirse o zaman
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
Bu gönderi eski ve muhtemelen çözüldü ama aynı sorunu yaşadım. Yeni sütun sırasını belirterek orijinal tablonun bir görünümünü oluşturarak bunu çözdüm.
Buradan görünümü kullanabilir veya görünümden yeni bir tablo oluşturabilirim.
GÖRÜNÜM ORİJİNAL_tab_vw AS OLUŞTUR A.col1, a.col3, a.col4, a.col2 seçin FROM original_tab a A.col1 NULL OLMADIĞI YERDE - ya da her neyse
Original_tab_vw’DEN new_table’ı SEÇİN
Orijinal tabloyu yeniden adlandırın veya bırakın ve yeni tablonun adını eski tabloya ayarlayın.
Sütun sırasının kesinlikle değiştirilmesi gerektiğinde ve yabancı anahtarlar kullanımdayken sütunları yeniden düzenlemek için beceriksiz bir seçenek olsa da, önce tüm veritabanını verilerle dökmek, sonra yalnızca schema ( pg_dump -s databasename > databasename_schema.sql
) ' yı dökmektir . Ardından, sütunları istediğiniz gibi yeniden düzenlemek için şema dosyasını düzenleyin, ardından veritabanını şemadan yeniden oluşturun ve son olarak verileri yeni oluşturulan veritabanına geri yükleyin.
Şu anda yapabileceğinizi sanmıyorum: Postgresql wiki'deki bu makaleye bakın .
Bu makaledeki üç geçici çözüm şunlardır:
Tabloyu PGAdmin'de açın ve alttaki SQL bölmesinde SQL Create Table deyimini kopyalayın. Ardından Sorgu Aracı'nı açın ve yapıştırın. Tabloda veri varsa, tablo adını "yeni_ad" olarak değiştirin, yoksa Tabloyu Bırak satırındaki "-" açıklamasını silin. Sütun sırasını gerektiği gibi düzenleyin. Son sütundaki eksik / gereksiz virgülün yerini değiştirmiş olmanız ihtimaline dikkat edin. Yeni SQL Create Table komutunu yürütün. Yenileyin ve ... voilà.
Tasarım aşamasında boş masalar için bu yöntem oldukça pratiktir.
Tabloda veri olması durumunda, verilerin sütun sırasını da yeniden düzenlememiz gerekir. Bu kolaydır: INSERT
eski tabloyu yeni sürümüne aktarmak için kullanın :
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... nerede c2
, c3
, c1
sütunlar vardır c1
, c2
, c3
onların yeni pozisyonlarda eski tablonun. Lütfen bu durumda düzenlenen "eski" tablo için "yeni" bir ad kullanmanız gerektiğini , aksi takdirde verilerinizi kaybedeceğinizi unutmayın . Sütun adlarının çok, uzun ve / veya karmaşık olması durumunda, yeni tablo yapısını bir metin düzenleyicisine kopyalamak için yukarıdaki ile aynı yöntemi kullanın ve yeni sütun listesini,INSERT
ifadeye .
Her şeyin yolunda olup olmadığını kontrol ettikten sonra DROP
, eski tablo ve 'yeni' adını 'eski' olarak değiştirin ALTER TABLE new RENAME TO old;
ve işiniz bitti.
Birçok tabloyu yeniden düzenlemek için çalışıyordum ve aynı sorguları defalarca yazmak zorunda kalmak istemiyordum, bu yüzden hepsini benim için yapmak için bir komut dosyası hazırladım. Esasen, o:
pg_dump
pg_dump
yeniden sıralanmış bir tablo oluşturmak için orijinal sorguyu değiştirirAşağıdaki basit komut çalıştırılarak kullanılabilir:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
Doğrulayabilmeniz ve test edebilmeniz için sql'yi yazdırıyor, buna dayandırmamın büyük bir nedeni buydu pg_dump
. Github deposunu burada bulabilirsiniz .
Django kullanıyorum ve baş ağrısı istemiyorsanız her tabloda id sütunu gerektirir. Maalesef dikkatsizdim ve bp.geo_location_vague tablomda bu alan yoktu. Küçük numara yaptım. Aşama 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
Adım 2: (tablo oluşturmadan - tablo otomatik olarak oluşturulacaktır!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
Aşama 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
Çünkü tabloda büyük seri pseudotipe ihtiyacım var. SELECT * 'den sonra pg'ye bigint tipi insetad bigserial oluşturulur.
4. adım: Şimdi görünümü bırakabilir, kaynak tabloyu bırakabilir ve yeni tabloyu eski adla yeniden adlandırabiliriz. Hile başarıyla sona erdi.
Bunu mümkün kılacak bazı geçici çözümler vardır:
Tüm tabloyu yeniden oluşturmak
Mevcut tablo içinde yeni sütunlar oluştur
Bir görünüm oluştur