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

MySQL,用一个查询更新多个表,mysql,sql,sql-update,Mysql,Sql,Sql Update,我有一个更新三个表的函数,但我使用三个查询来执行此操作。我希望使用一种更方便的方法进行良好实践 如何用一个查询更新MySQL中的多个表?存储过程通常就是为了这样做的:在一个序列中实现多个SQL语句。使用回滚,您可以确保将它们视为一个工作单元,即要么全部执行,要么一个也不执行,以保持数据一致。存储过程通常就是为了实现一个序列中的多个SQL语句。使用回滚,您可以确保将它们视为一个工作单元,即它们要么全部执行,要么没有执行,以保持数据一致。当您说多个查询时,您是指多个SQL语句,如中所示: UPDAT

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


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

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

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

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

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

您也可以通过一个查询使用如下连接执行此操作:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

当然,只需发送一个查询。您可以在此处阅读有关联接的更多信息:。这里还有一些关于排序和限制多个表更新的限制:(只需ctrl+f“join”)。

您也可以通过一个查询使用如下连接:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

当然,只需发送一个查询。您可以在此处阅读有关联接的更多信息:。这里还有一些关于排序和限制多个表更新的限制:(只需ctrl+f“join”)。

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

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

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

UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE
    Books.BookID = Orders.BookID
    AND Orders.OrderID = 1002;
要查看将要更新的内容,可以将其转换为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;
编辑:

只是为了好玩,让我们添加一些更有趣的东西

假设您有一个
书籍表
和一个
作者表
。您的
书籍
具有
作者id
。但是当最初创建数据库时,没有设置外键约束,后来前端代码中的一个错误导致一些书籍添加了无效的
author\u id
s。作为一名DBA,您不需要阅读所有这些
书籍
来检查
作者id应该是什么,因此决定数据捕获者将修复
书籍
以指向右侧的
作者
。但是有太多的书需要逐一阅读,假设你知道那些有
作者id
的书与实际的
作者
是正确的。只有那些不存在
作者id
的才是无效的。用户已经有了一个更新书籍细节的界面,开发者不想仅仅因为这个问题就改变这个界面。但是现有的接口没有一个
内部连接authors
,因此所有作者无效的书籍都被排除在外

你可以做的是:插入一个像“未知作者”这样的虚假作者记录。然后更新所有不良记录的
author\u id
,以指向未知作者。然后,数据捕获者可以搜索作者设置为“未知作者”的所有书籍,查找正确的作者并修复它们

如何更新所有不良记录以指向未知作者?这样(假设未知作者的
作者id
为99999):

上述内容还将把
作者id为空的
书籍
更新为未知作者。如果您不想这样做,当然可以添加
和books.author\u id不为NULL

要查看将要更新的内容,可以将其转换为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;
编辑:

只是为了好玩,让我们添加一些更有趣的东西

假设您有一个
书籍表
和一个
作者表
。您的
书籍
具有
作者id
。但是当最初创建数据库时,没有设置外键约束,后来前端代码中的一个错误导致一些书籍添加了无效的
author\u id
s。作为一名DBA,您不需要阅读所有这些
书籍
来检查
作者id应该是什么,因此决定数据捕获者将修复
书籍
以指向右侧的
作者
。但是有太多的书需要逐一阅读,假设你知道那些有
作者id
的书与实际的
作者
是正确的。只有那些不存在
作者id
的才是无效的。已经有一个界面供用户和开发人员更新书籍详细信息