游标清除重复数据

本文提供了一个使用游标清理数据库中重复记录的具体案例。针对手机号码重复导致无法发送短信的问题,通过两层游标操作,实现了对重复手机号码记录的有效删除。
有时候导数据会把数据导重,需要根据某些信息清除掉重复数据,同学做信息机业务的,不小心把用户信息导重复了,造成不能发短信。我帮他写了个游标来清理重复数据。membermobile是手机号、memberid是主键。下面是详细代码:

DECLARE @memberMobile nvarchar(255)
DECLARE @I INT
DECLARE @memberid INT
DECLARE TEST CURSOR FOR
select MemberMobile from tbl_member group by MemberMobile having count(MemberMobile)>1
SET @I = 1
OPEN TEST 
FETCH NEXT FROM TEST INTO @memberMobile
WHILE @@FETCH_STATUS = 0
BEGIN
    
declare test2 cursor for
    
select memberid from tbl_member where membermobile=@memberMobile 
    
    
open test2
    
fetch next from test2 into @memberid
    
while @@fetch_status=0
    
begin
        
fetch next from test2 into @memberid
        
if @I>1
          
delete from tbl_member where memberid=@memberid
        
set @I = @I + 1
    
end
    
close test2
    
deallocate test2
    
set @I = 1

    
FETCH NEXT FROM TEST INTO @memberMobile
END

CLOSE TEST
DEALLOCATE TEST
<think>嗯,用户遇到了网页翻页时数据重复的问题,需要解决。根据提供的引用资料,这个问题通常出现在使用MySQL进行分页查询,尤其是当排序字段存在重复值时。让我仔细看看这些引用内容,整理出可能的原因和解决方案。 首先,引用[3]提到,当排序字段的值全部相同时,MySQL会随机排序,导致分页数据重复。比如,如果按照领取时间排序,而同一批记录的领取时间相同,分页时就会出现重复。引用[5]也说明了类似的情况,同一时间点内的记录过多,分页时可能出现顺序紊乱。 那解决方案应该围绕如何确保排序字段的唯一性。引用[3]和[5]都建议在排序条件中加入唯一字段,比如主键id。例如,原来的ORDER BY gmt_create改为ORDER BY gmt_create DESC, id DESC,这样即使时间相同,id也能保证顺序稳定。这应该能解决大部分问题。 另外,用户可能没有考虑到数据变化的影响。比如,当翻页过程中有新增或删除数据时,原来的分页偏移量(如LIMIT 10, 10)可能不准。这时候,使用游标分页(即基于最后一条记录的排序值进行查询)会更可靠,如引用[2]中提到的避免使用LIMIT offset, size,转而用WHERE条件过滤。 还有,前端或后端处理分页时可能需要调整。比如,确保每次翻页时排序参数的传递正确,或者在数据插入时避免时间戳重复,比如引用[3]提到的批量插入导致时间一致,可以微调时间戳,比如使用更精确的时间,或者在业务逻辑上处理。 总结一下,解决方案应该包括修改SQL排序条件、使用游标分页、优化数据插入方式,以及前后端协同处理。需要一步步指导用户如何调整查询语句,并解释背后的原因,确保他们理解每个步骤的作用。同时,提醒可能的相关问题,比如性能优化,或者在动态数据中的分页策略。</think>### 分页数据重复问题的原因与解决方案 #### 问题原因 1. **排序字段重复值导致随机排序** 当分页查询的排序字段(如时间戳)存在重复值时,MySQL 会随机排列这些相同值的记录,导致翻页时出现重复数据。例如: $$ \text{SELECT id, gmt\_create FROM table ORDER BY gmt\_create DESC LIMIT 5,5} $$ 若多行数据的 `gmt_create` 值相同,翻页时可能重复出现这些记录[^3][^5]。 2. **动态数据变更干扰分页逻辑** 若在翻页过程中有新增或删除操作,基于 `LIMIT offset, size` 的传统分页方式会导致偏移量计算错误,从而出现数据重复或遗漏[^2][^4]。 --- #### 解决方案 **1. 优化排序字段的唯一性** 在 `ORDER BY` 子句中添加唯一字段(如主键 `id`)作为辅助排序条件,确保顺序稳定性。 ```sql -- 原问题SQL(可能导致重复) SELECT * FROM table ORDER BY create_time DESC LIMIT 10,10; -- 优化后SQL(避免重复) SELECT * FROM table ORDER BY create_time DESC, id DESC LIMIT 10,10; ``` 此方法通过唯一字段 `id` 消除排序字段重复时的随机性[^5]。 --- **2. 使用游标分页(Cursor-based Pagination)** 将传统基于页码的分页改为基于最后一条记录的排序值,避免 `LIMIT offset` 的偏移量问题。 ```sql -- 假设上一页最后一条记录的 create_time 为 '2023-10-01 12:00:00', id 为 100 SELECT * FROM table WHERE (create_time < '2023-10-01 12:00:00') OR (create_time = '2023-10-01 12:00:00' AND id < 100) ORDER BY create_time DESC, id DESC LIMIT 10; ``` 此方法通过锚点定位数据,适用于动态数据场景。 --- **3. 业务层去重与数据一致性保障** - **前端缓存**:在翻页时缓存已加载数据,通过对比 `id` 过滤重复项。 - **后端唯一标识**:返回数据时附加唯一性标识(如哈希值),供前端校验[^4]。 --- **4. 数据插入优化** 若排序字段(如时间戳)因批量操作产生重复值,可微调时间精度(例如精确到毫秒)或在业务逻辑中设置递增序列,避免重复[^3]。 --- #### 总结流程 1. **修改SQL排序规则** → 2. **采用游标分页替代传统分页** → 3. **前后端协同去重** → 4. **数据插入优化**。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值