更新における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つにすぎません。共有がいくつかの新しいデータベース開発に役立つことを願っています