2010-12-05 4 views
84

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

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

+3

вы можете обеспечить пример сгенерированного кода? Существует ли общий ключ между таблицами? –

+1

Учитывая голоса, пожалуйста, подумайте об изменении принятого ответа ... –

ответ

-16

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

+2

Если хранимая процедура будет работать, mysql поддерживает обновление с помощью JOIN – DavidScherer

0

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

+0

, где бы я написал процедуру? не могли бы вы привести пример? – Adamski

+0

Напротив, объясняя необходимость атомарности - важно также осознавать, что использование хранимых процедур не только гарантирует согласованность, но все же необходимо использовать транзакции; аналогичным образом, транзакции могут выполняться без использования хранимой процедуры при условии, что они выполняются по одному и тому же соединению. В этом случае использование обновления с несколькими таблицами еще лучше. – Duncan

0

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

+0

да, как я мог это достичь? – Adamski

+0

обновил мой ответ в соответствии с вашим вопросом. –

+0

mySqlQuery() - это настраиваемая функция или встроенная функция? Я хочу узнать больше об этом. – Debashis

27

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

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

345

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

Как это не может быть принятым ответом. – eddy147

+0

Если я хочу включить «LIMIT» в SQL Query, могу ли я сказать LIMIT 1 или LIMIT 2? – Bluedayz

+1

В чем преимущество этого и транзакции? Благодаря! – paulkon

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

Это гораздо более надежный ответ, чем популярный, и охватывает более сложные случаи. – Lizardx

1
UPDATE Table1,Table2 
SET Table1.NAME=Table2.NAME 
WHERE Table1.id=Table2.id ; 
Смежные вопросы