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

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

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

Ответ 1

Вы можете сделать это с помощью хранимой процедуры, объединив операторы UPDATE в одной транзакции.

Ответ 2

Возьмем случай с двумя таблицами 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;

Ответ 3

Вы также можете сделать это с помощью одного запроса, используя соединение, например:

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" ).

Ответ 4

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';

Ответ 5

UPDATE Table1,Table2 
SET Table1.NAME=Table2.NAME 
WHERE Table1.id=Table2.id ;

Ответ 6

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

Ответ 7

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