2013-03-13 57 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(或者其他任何你使用的)。當然,不要爲此使用實時數據庫;)