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

Ada*_*ski 115 mysql sql sql-update

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

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

小智 436

举两个表的情况下,BooksOrders.在情况下,我们增加了图书的数量在一个特定的顺序与Order.ID = 1002Orders表,然后我们还需要减少由在相同数量在我们的股票提供书籍总数Books表.

UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity+2,
    Books.InStock = Books.InStock-2
WHERE
    Books.BookID = Orders.BookID
    AND Orders.OrderID = 1002;
Run Code Online (Sandbox Code Playgroud)

  • 使用此查询时的一般警告.WHERE子句是针对每个表单独计算的.Books.BookID = Orders.BookID非常重要,没有它.Books表更新将发生在所有行上,而不仅仅发生在具有指定id的行上.有些教训是以艰难的方式学习的,这一课是以极其严谨的方式学习的. (22认同)
  • @nheimann1 这正是我总是建议人们使用 ANSI“内连接”语法的原因。忘记该条件并获得完整的笛卡尔连接太容易了。 (3认同)
  • 与交易相比,这样做有什么好处?谢谢! (2认同)
  • @paulkon,我假设在使用事务时,涉及到很多开销,因为如果事务中的任何过程失败,则必须提供回滚. (2认同)

Wod*_*din 63

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';
Run Code Online (Sandbox Code Playgroud)

要查看要更新的内容,可以将其转换为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';
Run Code Online (Sandbox Code Playgroud)


Ste*_*les 33

您也可以使用一个查询来执行此操作,如下所示:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;
Run Code Online (Sandbox Code Playgroud)

当然,只需发送一个查询.您可以在此处阅读有关联接的更多信息: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认同)

Ste*_*Cav 5

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