2016-03-31 18 views
0

大きなテーブルの新しいIDを生成しようとしています。 IDはであり、であり、は0で始まる必要があります(シーケンスは使用できません)。私は今のところ思い付くことは、次の関数である:私は本当にとにかくidを気にしないので、PostgreSQLクエリの最適化

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; 

私はむしろについてIDを気にしないしたい=をedge.id。カウント(ネットワーク)の更新を避ける方法はありますか?

乾杯、ダニエル

+0

Btw:あなたはシーケンスを '0'で始めることができます: 'シーケンスを作成するfoo_seq 0 minvalue 0で始める ' –

+0

シーケンスはギャップレスであることが保証されているとは思いませんか? –

+0

彼らは正しいわけではありません(あなたは0で始めることができないので、あなたはそれらを使いたくないと思っていました)。 –

答えて

1

数(ネットワーク)のアップデートを持つ回避する方法はありますか?あなたの質問がある場合は

は:

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; 
:これは、単一のステートメント内のループなしで行うことができる

:この代わりに、ループの単一のステートメントで行うことができ、その後、はい、これは可能です