Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Austauschen von Spaltenwerten in MySQL

Ich musste mich gerade damit auseinandersetzen und fasse meine Erkenntnisse zusammen.

  1. Die UPDATE table SET X=Y, Y=X Ansatz funktioniert offensichtlich nicht, da er einfach beide Werte auf Y setzt.

  2. Hier ist eine Methode, die eine temporäre Variable verwendet. Danke an Antony aus den Kommentaren von http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ für die Anpassung „IST NICHT NULL“. Ohne sie funktioniert die Abfrage unvorhersehbar. Siehe das Tabellenschema am Ende des Beitrags. Diese Methode tauscht die Werte nicht aus, wenn einer von ihnen NULL ist. Verwenden Sie Methode Nr. 3, die diese Einschränkung nicht hat.

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

  3. Diese Methode wurde von Dipin wieder einmal in den Kommentaren von http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Ich finde das die eleganteste und sauberste Lösung. Es funktioniert sowohl mit NULL- als auch mit Nicht-NULL-Werten.

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

  4. Ein anderer Ansatz, den ich mir ausgedacht habe und der zu funktionieren scheint:

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

Im Wesentlichen wird die erste Tabelle aktualisiert und die zweite wird verwendet, um die alten Daten abzurufen.
Beachten Sie, dass für diesen Ansatz ein Primärschlüssel vorhanden sein muss.

Dies ist mein 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);