У меня есть функция, которая обновляет три таблицы, но я использую три запроса для этого. Я хочу использовать более удобный подход для хорошей практики.
Как обновить несколько таблиц в MySQL с помощью одного запроса?
У меня есть функция, которая обновляет три таблицы, но я использую три запроса для этого. Я хочу использовать более удобный подход для хорошей практики.
Как обновить несколько таблиц в MySQL с помощью одного запроса?
Вы можете сделать это с помощью хранимой процедуры, объединив операторы UPDATE
в одной транзакции.
Возьмем случай с двумя таблицами Books
и Orders
.
В случае увеличения количества книг в определенном порядке с таблицей Order.ID = 1002
в Orders
, тогда нам также необходимо уменьшить общее количество книг, доступных на нашем складе, на то же число в таблице Books
.
UPDATE Books, Orders
SET Orders.Quantity=Orders.Quantity+2,
Books.InStock=Books.InStock-2
WHERE Books.BookID=Orders.BookID
AND Orders.OrderID = 1002;
Вы также можете сделать это с помощью одного запроса, используя соединение, например:
UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
И тогда просто отправьте этот один запрос, конечно. Вы можете узнать больше о объединениях здесь: http://dev.mysql.com/doc/refman/5.0/en/join.html. Также есть несколько ограничений для упорядочения и ограничения на несколько обновлений таблиц, которые вы можете прочитать здесь: http://dev.mysql.com/doc/refman/5.0/en/update.html (только ctrl + f "join" ).
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';
Чтобы узнать, что он собирается обновить, вы можете преобразовать это в оператор select, например:
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';
UPDATE Table1,Table2
SET Table1.NAME=Table2.NAME
WHERE Table1.id=Table2.id ;
Как правило, какие хранимые процедуры предназначены для: выполнения нескольких операторов SQL в последовательности. Используя откаты, вы можете убедиться, что они рассматриваются как одна единица работы, то есть либо все они выполнены, либо ни одна из них не поддерживает согласование данных.
Когда вы говорите несколько запросов, вы имеете в виду несколько операторов SQL, например:
UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;
Или несколько вызовов функций запроса, как в:
mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)
Первый может быть выполнен с использованием одного вызова mySqlQuery, если это то, чего вы хотели достичь, просто вызовите функцию mySqlQuery следующим образом:
mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)
Это выполнит все три запроса одним вызовом mySqlQuery().