2012-01-06 10 views
16

Mam dwie tabele, które potrzebują dokładnie tych samych wartości do celów denormalizacji.MySql zaktualizuj dwie tabele naraz

Oto zapytanie.

Pierwsza tabela

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1 

Druga tabela

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1 

Jak widać jedyną różnicą pomiędzy obu tabel jest ich nazwa i stół dwa nie ma pola lid

Zresztą połączyć obie aktualizacje tylko z jedną?

Odpowiedz

32

Powinna istnieć możliwość aktualizacji z wieloma tabelami, zgodnie z opisem w dokumentacji.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid) 
SET 
    a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200, 
    b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1 

Uwaga: Multi-table nie obsługuje LIMIT, więc może to spowodować więcej żalu w zależności od szczegółów.

Przechowywane procedury lub transakcje mogą być ładniejszym rozwiązaniem.

1

Są to dwa oddzielne zapytania i należy je traktować jako takie. Przykro mi to mówić, ale jeśli aktualizujesz dwie tabele z identycznymi danymi, prawdopodobnie istnieje lepszy sposób na zaprojektowanie bazy danych. Pamiętaj, aby zachować programowanie DRY.

Edytuj: Należy wycofać; możesz go używać do wielu tabel, ale nie możesz użyć ORDER BY ani LIMIT.

+0

Rozumiem, co masz na myśli, ale w naszym przypadku tak często resetujemy wynik do tabeli 1. Tabela druga to stałe wyniki, dlatego potrzebujemy dwóch tabel. Po prostu mam 5 zapytań o aktualizację z rzędu (proces wsadowy) i zastanawiałem się, czy mogę ograniczyć podróże do bazy danych. – user962449

+1

Czy nie byłoby łatwiej dodać pole do tabeli, która wykonuje to samo zadanie, które domyślnie jest "1", ale następnie ustawia się na "0", kiedy trzeba "zresetować" tabelę. –

+0

@ user962449 Przejdź przez to, szukając podobnego rozwiązania. Ta odpowiedź jest błędna - i została tak odnotowana przez autora. Powinieneś przyjąć lepszą odpowiedź w dalszej części. –

8

Jeśli istnieje jeden do jednego lub jeden do wielu relacji z Table_One do Table_Two, to będzie działać:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid; 
0

Jeśli można połączyć tabele, a następnie można utworzyć widok dwóch tabel, a następnie aktualizuj za pomocą tego widoku. W twoim przykładzie wygląda na to, że odpowiedni może być userid.

Podczas tworzenia widoku musisz trzymać się symbolu following guidelines.