Ho dovuto affrontare lo stesso e riassumerò le mie scoperte.
-
La tabella
UPDATE table SET X=Y, Y=X
l'approccio ovviamente non funziona, poiché imposterà entrambi i valori su Y. -
Ecco un metodo che utilizza una variabile temporanea. Grazie ad Antony dai commenti di http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ per il tweak "NON È NULLO". Senza di essa, la query funziona in modo imprevedibile. Vedi lo schema della tabella alla fine del post. Questo metodo non scambia i valori se uno di essi è NULL. Usa il metodo n. 3 che non ha questa limitazione.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Questo metodo è stato offerto da Dipin, ancora una volta, nei commenti di http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Penso che sia la soluzione più elegante e pulita. Funziona sia con valori NULL che non NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Un altro approccio che ho escogitato che sembra funzionare:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
In sostanza, la prima tabella è quella che viene aggiornata e la seconda viene utilizzata per estrarre i vecchi dati da.
Nota che questo approccio richiede la presenza di una chiave primaria.
Questo è il mio schema di test:
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);