MySQL, aktualizacja wielu tabel jednym zapytaniem
Mam funkcję, która aktualizuje trzy tabele, ale używam do tego trzech zapytań. Chciałbym zastosować bardziej wygodne podejście do dobrych praktyk.
Jak mogę zaktualizować wiele tabel w MySQL za pomocą jednego zapytania?
6 answers
Można to zrobić za pomocą procedury składowanej, łącząc polecenia UPDATE
w jednej transakcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 20:08:17
Weźmy przypadek dwóch tabel, Books
i Orders
.
W przypadku, gdy zwiększamy liczbę książek w określonej kolejności o Order.ID = 1002
w tabeli Orders
, wówczas musimy również zmniejszyć łączną liczbę książek dostępnych w naszym magazynie o tę samą liczbę w tabeli Books
.
UPDATE Books, Orders
SET Orders.Quantity=Orders.Quantity+2,
Books.InStock=Books.InStock-2
WHERE Books.BookID=Orders.BookID
AND Orders.OrderID = 1002;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 04:16:44
UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
t2.b = 42,
t3.c = t2.c
WHERE t1.a = 'blah';
Aby zobaczyć, co to będzie aktualizować, możesz przekonwertować to na instrukcję select, np.:
SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-31 10:59:38
Możesz to zrobić również za pomocą jednego zapytania używając join ' a w ten sposób:
UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
A następnie wyślij to jedno zapytanie, oczywiście. Więcej o połączeniach można przeczytać tutaj: http://dev.mysql.com/doc/refman/5.0/en/join.html . istnieje również kilka ograniczeń dotyczących zamawiania i ograniczania wielu aktualizacji tabeli, o których możesz przeczytać tutaj: http://dev.mysql.com/doc/refman/5.0/en/update.html (wystarczy ctrl + f "join").
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-05 23:23:09
Kiedy mówisz wiele zapytań, masz na myśli wiele poleceń SQL, jak w:
UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;
Lub wielokrotne wywołania funkcji zapytań jak w:
mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)
To pierwsze może być wykonane za pomocą jednego wywołania mySqlQuery jeśli to jest to, co chcesz osiągnąć, po prostu wywołaj funkcję mySqlQuery w następujący sposób:
mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
Spowoduje to wykonanie wszystkich trzech zapytań jednym wywołaniem mySqlQuery ().
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-05 23:05:42
Do tego zazwyczaj służą procedury składowane: implementacja kilku poleceń SQL w sekwencji. Korzystając z wycofań, możesz upewnić się, że są one traktowane jako jedna jednostka pracy, tj. albo wszystkie są wykonywane, albo żaden z nich nie jest, aby dane były spójne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-05 22:56:39