2015-11-03 9 views
7

Oldukça büyük bir tablomuz var (yaklaşık 1 milyar satır) ve kimlik tipini SERIAL'dan BIGSERIAL'a güncellemem gerekiyor; tahmin et neden?:). postgreSQL eşzamanlı olarak sütun türünü intint'ten bigint'e değiştir

Temelde bu komutla yapılabilir:

execute "ALTER TABLE my_table ALTER COLUMN id SET DATA TYPE bigint" 

Yine o sonsuza dek tabloyu kilit vuracak ve aşağı benim web hizmeti koydu.

Bu işlemi eşzamanlı olarak yapmanın oldukça basit bir yolu var mı (ne kadar sürecek olursa olsun)? Eğer eskiye, doldur, yeni bir sütun eklemek eskisini bırakıp yeni adlandırmak olabilir sizin id işaret yabancı anahtarlar yoksa

cevap

3

:

alter table my_table add column new_id bigint; 

begin; update my_table set new_id = id where id between 0 and 100000; commit; 
begin; update my_table set new_id = id where id between 100001 and 200000; commit; 
begin; update my_table set new_id = id where id between 200001 and 300000; commit; 
begin; update my_table set new_id = id where id between 300001 and 400000; commit; 
... 

create unique index my_table_pk_idx on my_table(new_id); 

begin; 
alter table my_table drop constraint my_table_pk; 
alter table my_table alter column new_id set default nextval('my_table_id_seq'::regclass); 
update my_table set new_id = id where new_id is null; 
alter table my_table add constraint my_table_pk primary key using index my_table_pk_idx; 
alter table my_table drop column id; 
alter table my_table rename column new_id to id; 
commit; 
+0

Teşekkür, bu çözüm oldukça zarif. Bana öyle geliyor ki hala bir problem var. New_id sütunlarını doldururken yeni satırlar tablomuza eklendiğinde, new_id değeri ayarlanmayacak ve benzersiz dizin oluşturma başarısız olabilir. Nexval varsayılan değerini ekleyene kadar ekleme sırasında yeni_id tetikleyici ayarı ekleyebilir miyiz? –

+0

Benzersiz dizin, 'null' değerlerini yok sayar, bu nedenle tetiklemeye gerek yoktur. –

+0

Eğer tablo my_table ekleme sütun new_id bigint eklemek; 'uzun zaman alır (1 saatten fazla sürer ve henüz bitmedi) ve diğer okuma işlemlerini engeller? –

İlgili konular