一段时间以来,我一直在研究存储过程。最近我一直想知道 UPDATE 究竟是如何工作的。
我有一个 while 循环,在其中我会一一更新表中的某些行,直到所有相关行都已更新。
我的同事建议我删除 while 循环,而只使用一个 UPDATE 语句。
但是,我不知道这是否可能?我不知道每次执行存储过程时会更新哪些行。
我有一个表变量,其中包含所有需要更新的 ID 的列表,并将其用作标识需要更新的行的键。我可以在不使用 while 循环的情况下同时更新所有行吗?
一段时间以来,我一直在研究存储过程。最近我一直想知道 UPDATE 究竟是如何工作的。
我有一个 while 循环,在其中我会一一更新表中的某些行,直到所有相关行都已更新。
我的同事建议我删除 while 循环,而只使用一个 UPDATE 语句。
但是,我不知道这是否可能?我不知道每次执行存储过程时会更新哪些行。
我有一个表变量,其中包含所有需要更新的 ID 的列表,并将其用作标识需要更新的行的键。我可以在不使用 while 循环的情况下同时更新所有行吗?
您的同事建议的方法称为基于集合的方法。
与其使用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
我希望这对你有意义。
您的同事是对的,因为多个查询最终可能会减慢您的数据库速度。大查询不是问题。我建议您按照这篇文章中的说明进行操作,它很好地展示了 UPDATE 命令的强大功能:http ://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a -single-sql-query/。
当然,在 PHP 中编写单个查询会使您更容易出错。我建议您只让 PHP 输出您的查询,然后您可以将整个内容直接检查到 MySQL(或您使用的任何其他内容)中。当然,不要为此使用实时数据库;)
是的。
我之前做过的一件事是将 ajoin
与我的更新一起使用。我知道这听起来很奇怪,但它确实有效。
您还可以构建in
子句或exists
子选择。
子句的危险之一in
是您使用的值列表是有限的。过去我遇到过一个问题,我的 SQL 语句太长而无法执行。
是的你可以。有不同的方法可以做到这一点,其中之一是
UPDATE table_to_update
SET whatever_you_want_to_set
WHERE table_id IN (SELECT id FROM @tableVariable);
你的同事说得对——一般来说,单个大 UPDATE 语句的执行速度比单独的小 UPDATE 快得多。