2013-03-13 53 views
3

我一直在研究存储过程一段时间了。最近我一直在想,UPDATE的工作原理。UPDATE如何工作?

我有一个while循环,我更新表中的某些行,一个接一个,直到所有相关的行都被更新。

我的同事建议我删除while循环,只需要一条UPDATE语句。

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

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

回答

4

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

相反,使用while循环或逐行处理行,您可以使用Set Based方法,它在所有方面都更好,让它成为性能或维护。

建议您可以使用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 

我希望这对你有意义。

1

是的。

我之前完成的一件事是在我的更新中使用join。我知道这听起来很奇怪,但它工作。

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

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

1

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

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

和你的同事有一点 - 单一大UPDATE语句一般的执行速度比单独的小更新速度加快

2

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

当然,在PHP中编写单个查询会使您更有可能犯错。我建议你只是让PHP输出你的查询,而不是直接把整个事情都检查到MySQL(或者其他任何你使用的)。当然,不要为此使用实时数据库;)