Po prostu miałem do czynienia z tym samym i podsumuję moje odkrycia.
-
Tabela
UPDATE table SET X=Y, Y=X
podejście oczywiście nie działa, ponieważ po prostu ustawi obie wartości na Y. -
Oto metoda wykorzystująca zmienną tymczasową. Podziękowania dla Antoniego z komentarzy http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ dla poprawki „IS NOT NULL”. Bez tego zapytanie działa nieprzewidywalnie. Zobacz schemat tabeli na końcu posta. Ta metoda nie zamienia wartości, jeśli jedna z nich ma wartość NULL. Użyj metody nr 3, która nie ma tego ograniczenia.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Ta metoda została zaoferowana przez Dipina po raz kolejny w komentarzach http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Myślę, że to najbardziej eleganckie i czyste rozwiązanie. Działa zarówno z wartościami NULL, jak i innymi niż NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Inne podejście, które wymyśliłem, wydaje się działać:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Zasadniczo pierwsza tabela jest aktualizowana, a druga służy do pobierania starych danych.
Pamiętaj, że to podejście wymaga obecności klucza podstawowego.
To jest mój schemat testowy:
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);