@d1zz7

Как сделать одно действие с несколькими значениями?

Кароче, есть список айдишек, к примеру: 1234, 45678, 64546. Нужно сделать ( к примеру) вот такое действие:
update `table` set id = айдишка из списка
where id = значение;

И это нужно сделать отдельно с каждой айдишкой.. Надеюсь вы поняли..
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
@alexalexes
Если нужно присвоить одно и то же значение атрибутам у нескольких определенных строк, то это делается элементарно.
update `table` set атрибут_не_первичный_ключ = 1
where id in (1, 2, 4, 10);

Другое дело, если это касается атрибутов с уникальным свойством.
Если нужно сделать рокировку значений, то поскольку первичный ключ имеет свойство уникального значения, то нужно действовать в два этапа.
1. Переписать id-шники интересуемых строк так, чтобы новый id был за диапазоном присваиваемых id.
Можно переписать в большую сторону, если у вас максимальное число записей пару тысяч, то воспользоваться новыми значениями, например, от миллиона.
Но проблема в том, что если система не остановлена во время этой рокировки, то вероятно, вставка новых строк будет происходить с присвоением макс. последнего значения +1, тогда новые строки окажутся с миллионными id-шками.
Нужно взять диапазон отрицательных чисел в качестве промежуточного состояния рокировки id.
update table
set id = case
   when id = 1 then -1
   when id = 2 then -2
   when id = 4 then -4
   when id = 10 then -10
   else id -- страховка от дурака, если неправильно описан in 
end
where id in (1, 2, 4, 10)

2. Второй шаг заключается в том, чтобы переписать нашим отрицательным id новые положительные значения, чтобы каждая строка получила новые значения 1,2,4,10. Например, можно поменять местами id соседей.
update table
set id = case
   when id = -1 then 2
   when id = -2 then 4
   when id = -4 then 10
   when id = -10 then 1
   else id -- страховка от дурака, если неправильно описан in 
end
where id in (-1, -2, -4, -10)

В итоге, такую операцию можно делать на работающей системе, не мешая созданию новых записей.
Чтобы вообще исключить коллизии, то лучше оба запроса делать в одной транзакции, при этом можно использовать положительные значения не используемого диапазона значений id.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы