sql循环语句在update中的应用

sql循环语句在update中的应用

在实际的开发场景中,我们有时候要对表中的所有数据进行批量修改,但是当数据量十分盘庞大时,比如几百万几千万条数据,这时候我们执行update语句的话就会长时间锁住该表。这样非常容易造成死锁现象(在企业中DBA肯定是不允许执行这种sql语句的)。所以为了避免出现这种问题,我们在执行批量修改的语句时就要分批修改,一次只能修改少量的数据,避免长时间占用该表。所以为了应对该种场景,可以使用一下的数据库的while语法,循环执行update语句。

现在我通过举例一种场景来实现循环操作的执行:

假设我们有一张表User(主键为id):

name

sex

刚某

东某

罗某

其中有百万条数据,这时候,万恶的产品突然来了个需求,需要实现需要在表中再加一个字段new_status(状态),并且历史数据全部设置为1,

这时候就开始执行数据库语句了:

1-- 在user表中添加字段 status 2alter table user add new_status int ; 3 4begin 5 6declare @start int -- 定义变量 start 7declare @end int -- 定义变量 end 8declare @maxId int -- 定义变量 maxId (主键最大值) 9 10set @start = 1 11set @end = 100000 -- 循环体每次执行1万条数据 12set @maxId = (select max(id) from user) -- user表中最大值 13 14-- 循环体开始 15while @start < @maxId 16 17begin 18-- 循环体内需要执行的 SQL 语法 19update user set new_status = 1 where id between @start and @start + @end 20set @start = @start + @end 21end 22--循环体结束 23 24end

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

SQL抽象语法树及改写场景应用

1背景我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集。比如sql语句,”selectfromt\_userwhereuser\_id10;”,意在从表t\_user中筛选出user\_id大

SQL UPDATE 语句:更新表中的记录语法及案例剖析

SQLUPDATE语句UPDATE语句用于更新表中的记录。SQLUPDATE语句UPDATE语句用于更新表中已存在的记录。SQLUPDATE语法UPDATE_table\_name_SET_column1_\_valu