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?

Author: Ryan Kohn, 2010-12-06

6 answers

Można to zrobić za pomocą procedury składowanej, łącząc polecenia UPDATE w jednej transakcji.

 -16
Author: Freddie,
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;
 384
Author: Irfan,
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';
 40
Author: Wodin,
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").

 30
Author: Stephen Searles,
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 ().

 1
Author: code_burgar,
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.

 0
Author: SteveCav,
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