如何批量修改某表某字段的值?
小白一枚,嘻嘻
多人预约,并记录每个人的预约状态,
预约状态有审核中,已通过,未通过。
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