交换数据库中两条记录的排列顺序

背景需求:最近做列表数据上移和下移功能,数据库有个index字段用来存储当前对象的排列序号;

第一版代码是同事写的,上移和下移功能分成两个接口,上移的时候将index-1;下移的时候将index+1;

这个方式,真的是无力吐槽;

测试人员反馈的bug信息是,排序几次之后就失去了排序功能,点击上移和下移列表并没有什么变化,或者是会一下子跳几格;

好嘛,查看数据库,一堆index重复

第二版代码我将两个接口合并成了一个交换接口,实际上前端传递两个id,当前对象的id和需要交换对象的id给我就OK了,剩下的逻辑部分后端来实现;

业务层代码如下:

交换数据库中两条记录的排列顺序_第1张图片

这段代码写好测试后就没再管,中规中矩的逻辑,但是中间查询了两次数据库更新了两次数据库,请求时间有点长,不过没有立即优化;下图是用postman测试接口时反馈的请求时间

过了几天,测试人员又提交了一次bug,说还是这个问题啊,我点击上移或者下移几次之后又出现了之前的情况啊,只不过这次出现的时候我需要很快的点击鼠标才行

没办法,再看数据库,又是一堆重复的index,我在自己电脑上吭哧吭哧打断点,就是没问题啊,然后怀疑是前端调用接口的时候重复调用,请求前端工程师加锁判断,证据呢?你怎么证明是我反复调用的问题导致的这个bug啊?无果,自己的bug自己改啊

第三版代码改为SQL语句直接交换两条记录的index

业务层代码如下

交换数据库中两条记录的排列顺序_第2张图片

第一次SQL语句如下

交换数据库中两条记录的排列顺序_第3张图片

诶,报了个错 [Err] 1093 - You can't specify target table 'item3' for update in FROM clause

查一下啊,这个错是什么意思啊,大致意思是,在同一语句中,不能先select出同一表中的某些值,再update这个表。

怎么改啊,添加中间表

改好后的SQL如下

交换数据库中两条记录的排列顺序_第4张图片

好了,用postman测测看请求时间

交换数据库中两条记录的排列顺序_第5张图片

嗯,好像效果好不错 O(∩_∩)O哈哈~ 

你可能感兴趣的:(数据库)