如何批量修改某表某字段的值?

小白一枚,嘻嘻

多人预约,并记录每个人的预约状态,
预约状态有审核中,已通过,未通过。
A端假如100人同时发起预约,B端管理员审核预约,可能通过的也就两三个人,
B端管理员点击三次按钮就可以更新数据库预约状态,
其它97人不想依次点击了,设计在预约截止时间自动改变状态为未通过。
那么如何改变未通过人的状态?是循环update数据库?
如果不是,那么有什么更优的解决方案?

另外发起预约时如何保证不拥堵,应该选用哪些技术


回答:

为实现批量修改预约状态且避免拥堵,你可以使用一次性的SQL更新语句,使用SQL语句一次性更新多行数据,而不是使用循环。这样可以减少数据库操作的次数。并结合缓存、限流、异步处理以及数据库优化技术以提高系统性能。


回答:

单纯从sql方面去考虑,可以用类似于以下sql去批量更新数据库,而不是循环update:

Update users Set status=1 Where user_id IN ('id1', 'id2','id3');

具体参考:https://runoops.com/note-mysql-batch-update.html


回答:

设计预约时间自动执行这个任务的话使用定时任务就可以,我想这不是你想要关注的重点
不同语言应该都有这样的框架或者自带的方法,比如Java里的Timer、Quartz框架、Spring Task等,一般搭配cron表达式使用就可以实现定时的效果
这里就不再赘述了
想要改变这些未通过人的状态,理论上它们在数据库里都有用户ID这个字段,如果你想指定这些ID,那你可以把它们都放进一个list里,然后用mybatis(我假设你使用mybatis)的批量更新:

List<Integer> userIdList = new ArrayList<>();

userIdList.add(第一个userId);

userIdList.add(第二个userId);

...

<update id="updateStatusBatch" parameterType="java.util.List">      

update 审核表

<trim prefix="set" suffixOverrides=",">

<trim prefix="审核状态的字段 = case" suffix="end,">

<foreach collection="list" index="index" item="item">

when 用户ID = #{item.用户ID,jdbcType=INTEGER} then #{item.代表用户状态为未审核通过的值,jdbcType=VARCHAR}

</foreach>

</trim>

</trim>

where 用户ID in

<foreach close=")" collection="list" item="item" open="(" separator=", ">

#{item.用户ID,jdbcType=INTEGER} #假设用户ID数据类型是int

</foreach>

</update>

如果你不想指定是哪些ID要更新状态,只要用这样的SQL即可:

<update id="updateUserStatus">      

update 审核表

set 审核字段="代表用户状态为未审核通过的值"

where 审核字段="代表用户状态为审核中的值"

</update>

至于发起预约时保证不拥堵得看你的数据量有多大了,具体的方案也不同,可以看一下大佬们的各种架构文章

以上是 如何批量修改某表某字段的值? 的全部内容, 来源链接: utcz.com/p/945083.html

回到顶部