Переупорядочение последовательности через триггер будет действительно трудным, особенно если SEQ
УНИКАЛЬНО и контролируется неотложным ограничением.Ваше обновление активирует триггер, который, в свою очередь, будет изменять другие строки, каждое обновление по очереди активирует указанный триггер ...
К счастью, эту бесконечную рекурсию было бы действительно трудно кодировать в Oracle, поскольку вы можетеНе изменяйте / не запрашивайте базовую таблицу в триггере .
В таком случае я бы посоветовал использовать процедурный подход.Например, в PLSQL:
PROCEDURE update_sequence(p_id NUMBER,
p_new_seq NUMBER) IS
l_old_seq NUMBER;
BEGIN
SELECT seq INTO l_old_seq FROM my_table WHERE ID = p_id;
UPDATE my_table
SET seq = CASE WHEN ID = p_id
THEN p_new_seq
ELSE seq + sign(l_old_seq - p_new_seq)
END
WHERE seq BETWEEN least(l_old_seq, p_new_seq)
AND greatest(l_old_seq, p_new_seq);
END;
. Строка p_id
будет размещена в последовательности p_new_seq
, и все строки между новой позицией и старой будут иметь свою последовательность, либо увеличенную, либо уменьшенную на 1.