Мне просто приходилось иметь дело с тем же, и я обобщу свои выводы.
UPDATE table SET X=Y, Y=X
, очевидно, не работает, поскольку он просто установит оба значения в Y . UPDATE swap_test SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
По существу, первая таблица обновляется, а вторая - используется для извлечения старых данных. Обратите внимание, что для этого подхода необходим первичный ключ.
Это моя тестовая схема:
CREATE TABLE `swap_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`x` varchar(255) DEFAULT NULL,
`y` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `swap_test` VALUES ('1', 'a', '10');
INSERT INTO `swap_test` VALUES ('2', NULL, '20');
INSERT INTO `swap_test` VALUES ('3', 'c', NULL);