Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Trocando valores de coluna no MySQL


Eu apenas tive que lidar com o mesmo e vou resumir minhas descobertas.

  1. A UPDATE table SET X=Y, Y=X A abordagem obviamente não funciona, pois apenas definirá os dois valores como Y.

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

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

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