Давайте для простоты предположим, что у вас есть две записи
id name
---------
1 john
id name
---------
2 jim
оба из таблицы t (но они могут быть из разных таблиц)
Вы могли бы сделать
UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2
Примечание:
Обновление первичных ключей имеет другие побочные эффекты, и, возможно, предпочтительным подходом было бы оставить первичные ключи такими, какие они есть, и поменять местами значения всех других столбцов.
Оговорка:
Причина, по которой работает t.id = t2.id, t2.id = t.id
, заключается в том, что в SQL обновление происходит на уровне транзакции. t.id
не является переменной, а =
не является присваиванием. Вы можете интерпретировать это как «установите t.id в значение, которое t2.id имел до эффекта запроса, установите t2.id в значение, которое t.id имел до эффекта запроса». Однако некоторые базы данных могут не обеспечивать надлежащую изоляцию, см., Например, этот вопрос (однако, выполнение вышеупомянутого запроса, который, вероятно, считается обновлением нескольких таблиц, вел себя в соответствии со стандартом в mysql).