Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zamiana wartości kolumn w MySQL

Po prostu miałem do czynienia z tym samym i podsumuję moje odkrycia.

  1. Tabela UPDATE table SET X=Y, Y=X podejście oczywiście nie działa, ponieważ po prostu ustawi obie wartości na Y.

  2. 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;

  3. 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;

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować replikację asynchroniczną z klastra Galera na samodzielny serwer MySQL z GTID

  2. Niezdefiniowana funkcja mysql_connect()

  3. MySQL — wybór kolumny spoza grupy według

  4. Jak uzyskać dzisiejsze rekordy w MySQL

  5. Jak zmienić nazwę tabeli w MySQL?