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

问题描述 投票:111回答:5

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

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

mysql sql sql-update
5个回答
426
投票

以两张桌子为例,BooksOrders。如果我们在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;

60
投票
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;

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


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

前者可以使用单个mySql Query调用完成,如果这是你想要实现的,只需按以下方式调用mySql_Query函数:

mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)

这将通过一个mySqlQuery()调用执行所有三个查询。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.