J'ai juste dû faire face à la même chose et je vais résumer mes conclusions.
-
La table
UPDATE table SET X=Y, Y=X
approche ne fonctionne évidemment pas, car elle définira simplement les deux valeurs sur Y. -
Voici une méthode qui utilise une variable temporaire. Merci à Antony des commentaires de http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ pour le tweak "IS NOT NULL". Sans cela, la requête fonctionne de manière imprévisible. Voir le schéma du tableau en fin d'article. Cette méthode n'échange pas les valeurs si l'une d'elles est NULL. Utilisez la méthode #3 qui n'a pas cette limitation.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Cette méthode a été proposée par Dipin dans, encore une fois, les commentaires de http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Je pense que c'est la solution la plus élégante et la plus propre. Cela fonctionne avec les valeurs NULL et non NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Une autre approche que j'ai trouvée et qui semble fonctionner :
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Essentiellement, la 1ère table est celle qui est mise à jour et la 2ème est utilisée pour extraire les anciennes données.
Notez que cette approche nécessite la présence d'une clé primaire.
Voici mon schéma de 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);