Обновление ключей сортировки после удаления - PullRequest
2 голосов
/ 14 ноября 2008

У меня есть таблица с полем sort_id. В этом поле находятся числа от 1 до n, которые определяют порядок наборов данных. Теперь я хочу удалить некоторые элементы, а затем я хочу изменить порядок таблицы. Поэтому мне нужен запрос, который «находит» пробелы и меняет поле sort_id в соответствии с изменениями.

Конечно, я мог бы сделать что-то вроде этого:

SELECT sort_id FROM table WHERE id = 5

Затем сохраните sort_id и затем:

DELETE FROM table WHERE id = 5
UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above}

Но я бы хотел сделать процесс переупорядочения за один шаг.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2008

У Младена и Арво есть хорошие идеи, но, к сожалению, в MySQL вы не можете SELECT и UPDATE одной и той же таблицы в одном выражении (даже в подзапросе). Это известное ограничение MySQL.

Вот решение, которое использует пользовательские переменные MySQL:

SET @i := 0;
UPDATE mytable
SET sort_id = (@i := @i + 1)
ORDER BY sort_id;

Что бы это ни стоило, я бы в любом случае не стал этого делать. Если ваш sort_id используется только для сортировки, а не как «номер строки», то после удаления строки, где id=6, строки по-прежнему в отсортированном порядке. Значения не обязательно должны быть последовательными для сортировки.

0 голосов
/ 14 ноября 2008

Я не знаю вариантов синтаксиса MySQL и не могу протестировать запрос в реальном времени, но что-то вроде следующего должно дать вам хотя бы идею:

update table t1
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)
0 голосов
/ 14 ноября 2008

для сервера sql 2005: вот как вы получите новую последовательность:

SELECT row_number() over(order by sort_id) as RN
FROM table

обновление таблицы означает, что вы должны присоединиться, чтобы выбрать к вашему обновлению:

update t1
set sort_id = t2.RN
FROM table t1 
     join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
        on t1.UniqueId = t2.UniqueId
...