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

Skifter kolonneværdier i MySQL

Jeg skulle bare forholde mig til det samme, og jeg vil opsummere mine resultater.

  1. UPDATE table SET X=Y, Y=X tilgang virker åbenbart ikke, da den blot vil sætte begge værdier til Y.

  2. Her er en metode, der bruger en midlertidig variabel. Tak til Antony fra kommentarerne fra http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ for "IS NOT NULL" tweak. Uden det fungerer forespørgslen uforudsigeligt. Se tabelskemaet i slutningen af ​​indlægget. Denne metode bytter ikke værdierne, hvis en af ​​dem er NULL. Brug metode #3, der ikke har denne begrænsning.

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

  3. Denne metode blev tilbudt af Dipin i, endnu en gang, kommentarerne fra http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Jeg synes, det er den mest elegante og rene løsning. Det virker med både NULL- og ikke-NULL-værdier.

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

  4. En anden tilgang, som jeg fandt på, ser ud til at virke:

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

Grundlæggende er den første tabel den, der bliver opdateret, og den anden bruges til at hente de gamle data fra.
Bemærk, at denne tilgang kræver, at en primær nøgle er til stede.

Dette er mit testskema:

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. PL/pgSQL anonym kodeblok

  2. Sådan omdøbes en tabelkolonne i Oracle 10g

  3. Yndlingstricks til tuning af ydeevne

  4. Få tidsforskel mellem to gange i PHP