3

一段时间以来,我一直在研究存储过程。最近我一直想知道 UPDATE 究竟是如何工作的。

我有一个 while 循环,在其中我会一一更新表中的某些行,直到所有相关行都已更新。

我的同事建议我删除 while 循环,而只使用一个 UPDATE 语句。

但是,我不知道这是否可能?我不知道每次执行存储过程时会更新哪些行。

我有一个表变量,其中包含所有需要更新的 ID 的列表,并将其用作标识需要更新的行的键。我可以在不使用 while 循环的情况下同时更新所有行吗?

4

4 回答 4

4

您的同事建议的方法称为基于集合的方法。

与其使用while循环或逐行处理,不如使用基于集合的方法来完成,这在所有方面都更好,无论是性能还是维护。

正如建议的那样,您可以使用 IN 子句或 Inner Join 来更新表,因为您确实有唯一值来更新相应的表。

UPDATE table_to_update 
SET whatever_you_want_to_set 
From temptable 
inner join temptable on temptable.key = table_to_update.key

我希望这对你有意义。

于 2013-03-13T11:16:47.457 回答
2

您的同事是对的,因为多个查询最终可能会减慢您的数据库速度。大查询不是问题。我建议您按照这篇文章中的说明进行操作,它很好地展示了 UPDATE 命令的强大功能:http ://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a -single-sql-query/

当然,在 PHP 中编写单个查询会使您更容易出错。我建议您只让 PHP 输出您的查询,然后您可以将整个内容直接检查到 MySQL(或您使用的任何其他内容)中。当然,不要为此使用实时数据库;)

于 2013-03-13T11:14:45.833 回答
1

是的。

我之前做过的一件事是将 ajoin与我的更新一起使用。我知道这听起来很奇怪,但它确实有效。

您还可以构建in子句或exists子选择。

子句的危险之一in是您使用的值列表是有限的。过去我遇到过一个问题,我的 SQL 语句太长而无法执行。

于 2013-03-13T11:11:22.427 回答
1

是的你可以。有不同的方法可以做到这一点,其中之一是

UPDATE table_to_update 
    SET whatever_you_want_to_set 
    WHERE table_id IN (SELECT id FROM @tableVariable);

你的同事说得对——一般来说,单个大 UPDATE 语句的执行速度比单独的小 UPDATE 快得多

于 2013-03-13T11:12:24.170 回答