Как бы я написал триггер для изменения порядка порядкового номера? - PullRequest
0 голосов
/ 14 октября 2011

У меня есть простая таблица в Oracle с тремя столбцами:

ID    NCHAR(10)
NAME  NCHAR(50)
SEQ   NUMBER

Поле SEQ основано на 0 и позволяет пользователю перетаскивать записи и изменять порядок списка (используя сортировку jQuery),Я пытаюсь выяснить, как изменить все порядковые номера, чтобы они оказались в правильном порядке в базе данных.

Я начал создавать триггер перед обновлением, чтобы изменить все номера SEQоснованный на значениях :OLD и :NEW, но остановился, когда я понял, что это приведет к бесконечному циклу, когда триггер просто продолжит работать, так как я обновляю кучу записей.Я могу получить триггер, чтобы выполнить это поведение, или я должен написать это вручную в коде?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 14 октября 2011

Переупорядочение последовательности через триггер будет действительно трудным, особенно если 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.

1 голос
/ 14 октября 2011

Самое простое, что можно сделать, это отказаться от идеи использования последовательной последовательности и вместо этого обновить перемещенную запись, чтобы она стала средним значением предыдущего и следующего значения в данном месте.

Например, скажем, у вас есть этот список:

ID   NAME    SEQ
1111 Fred    10
2222 Bob     20
3333 Ted     30

Чтобы переместить «Тед» во второе место в списке, вы должны установить последовательность на 15 (20 + 10/2). Если позже вы переместите кого-нибудь между «Фредом» и «Тедом», они получат результат 12,5. Если вы действительно почувствовали необходимость, вы можете иметь триггер after update для всей таблицы (а не для каждой строки), который устанавливает для SEQ равные интервалы значений.

0 голосов
/ 14 октября 2011

используется подход со связанным списком.

указывает запись на запись прямо перед ней в порядке.тогда вы минимизируете обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...