sql >> Base de Datos >  >> RDS >> Mysql

Intercambio de valores de columna en MySQL

Tuve que lidiar con lo mismo y resumiré mis hallazgos.

  1. La tabla UPDATE table SET X=Y, Y=X El enfoque obviamente no funciona, ya que simplemente establecerá ambos valores en Y.

  2. Aquí hay un método que usa una variable temporal. Gracias a Antony por los comentarios de http://beerpla .net/2009/02/17/intercambiar-valores-de-columna-en-mysql/ para el ajuste "NO ES NULO". Sin él, la consulta funciona de forma impredecible. Vea el esquema de la tabla al final de la publicación. Este método no intercambia los valores si uno de ellos es NULL. Use el método #3 que no tiene esta limitación.

    UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;

  3. Este método fue ofrecido por Dipin en, una vez más, los comentarios de http://beerpla.net/2009/02/17/intercambio-de-valores-de-columna-en-mysql/ . Creo que es la solución más elegante y limpia. Funciona con valores NULL y no NULL.

    UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

  4. Otro enfoque que se me ocurrió que parece funcionar:

    UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

Esencialmente, la primera tabla es la que se actualiza y la segunda se usa para extraer los datos antiguos.
Tenga en cuenta que este enfoque requiere que esté presente una clave principal.

Este es mi esquema de prueba:

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