То, что я делал в прошлом, когда управлял ордером, - это не вариант - выполнить два обновления. Первый сдвигает группу вверх за пределы любых используемых в настоящее время значений, обеспечивая отсутствие коллизий. Второй затем сдвигает их туда, где они должны быть. В общем виде идея может быть проиллюстрирована этим:
UPDATE aTable SET somevalue = somevalue + 10000 WHERE somevalue > x;
UPDATE aTable SET somevalue = somevalue - 10000 - y WHERE somevalue > x + 10000;
«10000» - это просто значение, которое сдвинет диапазон после столкновения, y - это величина, которую вы действительно хотите сместить. Очевидно, что если уже есть значения около 10000, число должно быть другим. Чтобы избежать необходимости запрашивать безопасное значение, есть еще один вариант, если конструкция позволяет ....
Если отрицательные значения не используются, а дизайн таблицы допускает отрицательные числа, эту версию процесса применить немного проще:
UPDATE aTable SET somevalue = somevalue * -1 WHERE somevalue > x;
UPDATE aTable SET somevalue = (somevalue * -1) - y WHERE somevalue < 0;
Это предполагает, что обычно нет отрицательных значений, и для безопасности обновления должны выполняться в транзакции (вместе с первоначальным удалением), чтобы потенциальные параллельные приложения этого решения не сталкивались. (Изменить: Обратите внимание, что требование транзакций / параллелизма распространяется на обе формы, которые я представил.)
Редактировать: О, я только что заметил, что ответ Гордона был довольно похож ... голые знаки минус выглядели как пятна на моем экране. Если Гордон не работает, это тоже не будет.