MySQL, обновить несколько таблиц с одним запросом



У меня есть функция, которая обновляет три таблицы, но я использую три запроса, чтобы выполнить это. Я хочу использовать более удобный подход для хорошей практики.



Как я могу обновить несколько таблиц в MySQL с помощью одного запроса?

535   6  

6 ответов:

вы можете сделать это с помощью хранимой процедуры, комбинируя 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 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.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").

когда вы говорите несколько запросов, вы имеете в виду несколько операторов 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 ().

обычно это то, для чего предназначены хранимые процедуры: для реализации нескольких операторов SQL в последовательности. Используя откаты, вы можете гарантировать, что они обрабатываются как одна единица работы, т. е. либо все они выполняются, либо ни один из них, чтобы сохранить согласованность данных.

Comments

    Ничего не найдено.