2016-03-31 1 views
0

Я пытаюсь создать новые идентификаторы для большой таблицы. Идентификаторы должны быть последовательных и должны начать с 0 (Поэтому я не могу использовать последовательность). То, что я придумал до сих пор является следующая функция:Оптимизация запросов 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, так как я на самом деле не волнует идентификаторами в любом случае. Есть ли способ избежать подсчета (сетевого) обновления?

Приветствия, Daniel

+0

Btw: вы _can_ начинаете последовательность в '0':' create sequence 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^