2016-03-31 22 views
0

Büyük bir tablo için yeni kimlikler oluşturmaya çalışıyorum. İD'ler ardışık olmalıdır ve 0 'dan başlamalıdır (Yani diziyi kullanamıyorum). Şimdiye kadar ne ile gelip aşağıdaki fonksiyonudur: Gerçekten zaten id hakkındaki umurumda değil çünküPostgreSQL Sorgu Optimizasyonu

CREATE OR REPLACE FUNCTION genIds() RETURNS integer AS $$ 
DECLARE 
    edge RECORD; 
    i INTEGER := 0; 
BEGIN 
    FOR edge IN SELECT * FROM network LOOP 
     UPDATE network SET id = i WHERE id = edge.id; 
     i := i + 1; 
    END LOOP; 
    RETURN i; 
END; 
$$ LANGUAGE plpgsql; 

Ben daha çok yaklaşık kimliği ilgilendirmiyor istiyoruz = edge.id. Sayım (ağ) güncellemelerinden kurtulmanın bir yolu var mı?

Alkış, Daniel

+0

Btw: siz _can_ '0' dizisinde bir sıralama yapın:' foo_seq dizisini yaratın 0 minvalue 0 ile başlayın; ' –

+0

Dizilimlerin boşluksuz olmadığını garanti ettim mi? –

+0

Bunlar doğru değil (Ben bunları kullanmak istemediğini düşündüm çünkü onları 0'dan başlayamazsın). –

cevap

1

sayımı (ağ) güncellemelerini zorunda kalmamak için bir yol var mı? Sorunuz,

:

with numbered as (
    select id as old_id, 
     row_number() over (order by id) as new_id 
    from network 
) 
update network nt 
    set id = nb.new_id - 1 // -1 to start at 0 
from numbered nb 
where nb.old_id = nt.id; 
: Bu, tek bir açıklamada bir döngü olmadan yapılabilir

: Bu döngüsü yerine tek bir deyimi ile yapılır, sonra evet bu mümkün