在實際的開發場景中,我們有時候要對錶中的所有資料進行批次修改,但是當資料量十分盤龐大時,比如幾百萬幾千萬條資料,這時候我們執行update語句的話就會長時間鎖住該表。這樣非常容易造成死鎖現象(在企業中DBA肯定是不允許執行這種sql語句的)。所以為了避免出現這種問題,我們在執行批次修改的語句時就要分批修改,一次只能修改少量的資料,避免長時間佔用該表。所以為了應對該種場景,可以使用一下的資料庫的while語法,迴圈執行update語句。
現在我通過舉例一種場景來實現迴圈操作的執行:
假設我們有一張表User(主鍵為id):
name | sex |
---|---|
剛某 | 男 |
– | – |
東某 | 男 |
羅某 | 男 |
其中有百萬條資料,這時候,萬惡的產品突然來了個需求,需要實現需要在表中再加一個欄位new_status(狀態),並且歷史資料全部設定為1,
這時候就開始執行資料庫語句了:
-- 在user表中新增欄位 status
alter table user add new_status int ;
begin
declare @start int -- 定義變數 start
declare @end int -- 定義變數 end
declare @maxId int -- 定義變數 maxId (主鍵最大值)
set @start = 1
set @end = 100000 -- 迴圈體每次執行1萬條資料
set @maxId = (select max(id) from user) -- user表中最大值
-- 迴圈體開始
while @start < @maxId
begin
-- 迴圈體內需要執行的 SQL 語法
update user set new_status = 1 where id between @start and @start + @end
set @start = @start + @end
end
--迴圈體結束
end
這種迴圈語法適用於非常多的場景,這只是其中的一種,希望我的分享對一些資料庫萌新在開發中有所幫助