sql回圈陳述句在update中的應用
在實際的開發場景中,我們有時候要對表中的所有資料進行批量修改,但是當資料量十分盤龐大時,比如幾百萬幾千萬條資料,這時候我們執行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
這種回圈語法適用于非常多的場景,這只是其中的一種,希望我的分享對一些資料庫萌新在開發中有所幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/118657.html
標籤:其他
