sql >> Database >  >> RDS >> Mysql

Kolomwaarden omwisselen in MySQL

Ik had net hetzelfde te maken en ik zal mijn bevindingen samenvatten.

  1. De UPDATE table SET X=Y, Y=X aanpak werkt duidelijk niet, omdat het gewoon beide waarden op Y zet.

  2. Hier is een methode die een tijdelijke variabele gebruikt. Met dank aan Antony van de opmerkingen van http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ voor de "IS NIET NULL" tweak. Zonder dit werkt de query onvoorspelbaar. Zie het tabelschema aan het einde van het bericht. Deze methode verwisselt de waarden niet als een van hen NULL is. Gebruik methode #3 die deze beperking niet heeft.

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

  3. Deze methode werd aangeboden door Dipin in, nogmaals, de opmerkingen van http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Ik denk dat het de meest elegante en schone oplossing is. Het werkt met zowel NULL- als niet-NULL-waarden.

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

  4. Een andere benadering die ik bedacht die lijkt te werken:

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

In wezen is de 1e tabel degene die wordt bijgewerkt en de 2e wordt gebruikt om de oude gegevens uit te halen.
Merk op dat voor deze benadering een primaire sleutel aanwezig moet zijn.

Dit is mijn testschema:

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


  1. Een string invoegen in een andere string in SQL Server met STUFF()

  2. SQL Server-verwijderinstructie:één rij verwijderen of meerdere rijen uit de tabel verwijderen

  3. Hoe controleer ik of een waarde een geheel getal is in MySQL?

  4. Hoe te updaten/verwijderen met elementen uit twee verschillende tabellen SQLite