更新におけるSQLループステートメントの適用

更新におけるSQLループステートメントの適用

実際の開発シナリオでは、テーブル内のすべてのデータをバッチで変更する必要がある場合がありますが、データの量が非常に多い場合(数百万から数千万のデータなど)、更新ステートメントを実行すると時間がかかります。テーブルをロックする時間。これは非常に簡単にデッドロック現象を引き起こします(エンタープライズでは、DBAがこの種のSQLステートメントを実行することは絶対に許可されていません)。したがって、この問題を回避するには、バッチ変更を実行するときにステートメントをバッチで変更する必要があり、一度に変更できるのは少量のデータのみであり、長時間テーブルを占有することを回避できます。したがって、このようなシナリオに対処するために、次のデータベースのwhile構文を使用して、ループ内で更新ステートメントを実行できます。

次に、シナリオの例を使用してループ操作を実装します。

テーブルUser(主キーはid)があるとします。

名前 セックス
ギャング・ムー 男性
ドンモウ 男性
羅茂 男性

100万個のデータがあります。現時点で、悪意のある製品が突然要求されました。テーブルにもう1つのフィールドnew_status(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 

この種類のループ構文は多くのシナリオに適しています。これはそれらの1つにすぎません。共有がいくつかの新しいデータベース開発に役立つことを願っています

おすすめ

転載: blog.csdn.net/fei476662546/article/details/108753217