Идентификаторы обмена относительно легко реализовать с помощью хранимой процедуры и временной таблицы:
CREATE PROCEDURE `swapIDs`(aTable varchar(64),aID1 int(11),aID2 int(11))
BEGIN
drop temporary table if exists swapIDsTable;
SET @s = concat('create temporary table swapIDsTable like ',aTable); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @s = concat('insert into swapIDsTable select * from ',aTable,' where id=',aID1); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @s = concat('delete from ', aTable, ' where id=',aID1); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @s = concat('update ', aTable, ' set id=',aID1,' where id=',aID2); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @s = concat('update swapIDsTable set id=',aID2,' where id=',aID1); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @s = concat('insert into ', aTable,' select * from swapIDsTable where id=',aID2); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
drop temporary table if exists swapIDsTable;
END |
Но представьте, что вы поменяли идентификаторы, которые обновляются другим пользователем на стороне клиента (приложения), и только подсказку (для приложения), чтобы понять, какой необработанный файл для обновления является идентификатором. Это было бы кошмаром.
Таким образом, эта процедура может быть на 100% полезной только для одного пользователя.
Другой способ - обновить (обменять) все значения столбцов между двумя строками:
UPDATE targetTable tab1, targetTable tab2 SET tab1.<colX>=tab2.<colX>, tab2.<colX>=tab1.<colX> where tab1.id=<id1> and tab2.id=<id2>;
Еще должен быть какой-то механизм синхронизации.