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
这种循环语法适用于非常多的场景,这只是其中的一种,希望我的分享对一些数据库萌新在开发中有所帮助