Mysql
 sql >> Database >  >> RDS >> Mysql

Scambiare i valori delle colonne in MySQL

Ho dovuto affrontare lo stesso e riassumerò le mie scoperte.

  1. La tabella UPDATE table SET X=Y, Y=X l'approccio ovviamente non funziona, poiché imposterà entrambi i valori su Y.

  2. 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;

  3. 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;

  4. 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);