Если нужно присвоить одно и то же значение атрибутам у нескольких определенных строк, то это делается элементарно.
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.