Задать вопрос
d1zz7
@d1zz7

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

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

И это нужно сделать отдельно с каждой айдишкой.. Надеюсь вы поняли..
  • Вопрос задан
  • 66 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы