我有一个更新三个表的函数,但我使用三个查询来执行此操作。我希望使用更方便的方法进行良好实践。
如何使用单个查询更新MySQL中的多个表?
答案 0 :(得分:421)
以两个表格Books
和Orders
为例。如果我们在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_availability
; Table2
和外键_id
和DateTime列last_update
,我想将_id
中Table1
14的文档的可用性更改为0,即不可用并更新Table2
,带有上次更新文档的时间戳。以下查询将完成任务:
UPDATE Table1, Table2
SET doc_availability = 0, last_update = NOW()
WHERE Table1._id = Table2._id AND Table1._id = 14