MySQL,用一个查询更新多个表

时间:2010-12-05 22:51:03

标签: mysql sql sql-update

我有一个更新三个表的函数,但我使用三个查询来执行此操作。我希望使用更方便的方法进行良好实践。

如何使用单个查询更新MySQL中的多个表?

6 个答案:

答案 0 :(得分:421)

以两个表格BooksOrders为例。如果我们在Order.ID = 1002表格中使用Orders增加特定订单中的图书数量,那么我们还需要将{{1}中我们库存中可用图书的总数减少相同的数量表格。

Books

答案 1 :(得分:59)

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

使用与其他答案相同的表格的示例:

SELECT Books.BookID, Orders.OrderID,
    Orders.Quantity AS CurrentQuantity,
    Orders.Quantity + 2 AS NewQuantity,
    Books.InStock AS CurrentStock,
    Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;

UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;

答案 2 :(得分:33)

您也可以使用一个查询来执行此操作:

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”)。

答案 3 :(得分:2)

当您说多个查询时,您的意思是多个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()调用执行所有三个查询。

答案 4 :(得分:0)

这通常是存储过程的用途:在序列中实现多个SQL语句。使用回滚,您可以确保将它们视为一个工作单元,即它们都被执行或者都不执行,以保持数据的一致性。

答案 5 :(得分:0)

假设我有Table1和主键_id和布尔列doc_availabilityTable2和外键_id和DateTime列last_update,我想将_idTable1 14的文档的可用性更改为0,即不可用并更新Table2,带有上次更新文档的时间戳。以下查询将完成任务:

UPDATE Table1, Table2 
SET doc_availability = 0, last_update = NOW() 
WHERE Table1._id = Table2._id AND Table1._id = 14