Eu apenas tive que lidar com o mesmo e vou resumir minhas descobertas.
-
AUPDATE table SET X=Y, Y=X
A abordagem obviamente não funciona, pois apenas definirá os dois valores como Y.
-
Aqui está um método que usa uma variável temporária. Obrigado a Antony pelos comentários de http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ para o ajuste "NÃO É NULO". Sem ele, a consulta funciona de forma imprevisível. Veja o esquema da tabela no final do post. Este método não troca os valores se um deles for NULL. Use o método nº 3 que não tem essa limitação.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Este método foi oferecido por Dipin, mais uma vez, nos comentários de http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Acho que é a solução mais elegante e limpa. Funciona com valores NULL e não NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Outra abordagem que inventei que parece funcionar:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Essencialmente, a 1ª tabela é aquela que está sendo atualizada e a 2ª é usada para extrair os dados antigos.
Observe que essa abordagem requer que uma chave primária esteja presente.
Este é o meu esquema de teste:
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);