sql迴圈語句在update中的應用

2020-09-24 12:00:52

sql迴圈語句在update中的應用

在實際的開發場景中,我們有時候要對錶中的所有資料進行批次修改,但是當資料量十分盤龐大時,比如幾百萬幾千萬條資料,這時候我們執行update語句的話就會長時間鎖住該表。這樣非常容易造成死鎖現象(在企業中DBA肯定是不允許執行這種sql語句的)。所以為了避免出現這種問題,我們在執行批次修改的語句時就要分批修改,一次只能修改少量的資料,避免長時間佔用該表。所以為了應對該種場景,可以使用一下的資料庫的while語法,迴圈執行update語句。

現在我通過舉例一種場景來實現迴圈操作的執行:

假設我們有一張表User(主鍵為id):

namesex
剛某
東某
羅某

其中有百萬條資料,這時候,萬惡的產品突然來了個需求,需要實現需要在表中再加一個欄位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 

這種迴圈語法適用於非常多的場景,這只是其中的一種,希望我的分享對一些資料庫萌新在開發中有所幫助