sql >> Databáze >  >> RDS >> Mysql

Výměna hodnot sloupců v MySQL

Zrovna jsem se musel vypořádat se stejným a shrnu své poznatky.

  1. UPDATE table SET X=Y, Y=X přístup zjevně nefunguje, protože pouze nastaví obě hodnoty na Y.

  2. Zde je metoda, která používá dočasnou proměnnou. Děkuji Antonymu z komentářů http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ pro vyladění „IS NOT NULL“. Bez něj funguje dotaz nepředvídatelně. Viz schéma tabulky na konci příspěvku. Tato metoda nezamění hodnoty, pokud je jedna z nich NULL. Použijte metodu č. 3, která toto omezení nemá.

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

  3. Tuto metodu nabídl Dipin opět v komentářích http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Myslím, že je to nejelegantnější a nejčistší řešení. Pracuje s hodnotami NULL i non-NULL.

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

  4. Zdá se, že funguje další přístup, se kterým jsem přišel:

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

První tabulka je v podstatě ta, která se aktualizuje, a druhá tabulka se používá k získávání starých dat.
Upozorňujeme, že tento přístup vyžaduje přítomnost primárního klíče.

Toto je moje testovací schéma:

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. Monitorování záloh napříč instancemi

  2. Jak odstranit značky HTML z řetězce na serveru SQL?

  3. Jak získat kumulativní součet

  4. Jádro Entity Framework – Obsahuje Rozlišují se malá a velká písmena?