月底算薪时出现迟到记录被重复扣款,非常影响员工体验,这时要怎么快速删除重复sql语句?
【问题剖析】
多源打卡(门禁、手机、网页补卡)并行写入,同一时间点可能落进多条记录。传统NOT IN写法在高并发场景下锁表时间长,直接把早高峰的实时打卡拖死;而且考勤表通常按月分区,如果DELETE语句扫全表,分区优势瞬间作废。
【方案:窗口函数+软删除,删除重复sql语句零阻塞】
MySQL 8.0及以上可直接用ROW_NUMBER():
WITH d AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY emp_no, DATE(check_time), check_type
ORDER BY check_time) AS rn
FROM attendance
WHERE is_deleted = 0
)
UPDATE attendance a
JOIN d USING(id)
SET a.is_deleted = 1
WHERE d.rn > 1;
逻辑:同一天、同员工、同类型只留最早一条,其余标记软删除;下游报表统一加AND is_deleted = 0,既合规又省空间。索引覆盖(emp_no, check_time)后,千万级记录30秒内完成。
【落地清单】
1. 先备库EXPLAIN验证走索引;
2. 打开performance_schema监控rows_examined;
3. 留48小时binlog,误操作可秒回滚;
4. 定期重建唯一索引,防止再次写入重复。
把删除重复sql语句的脚本一键封装后,考勤表终于清爽了。如果你还想了解如何去某个字段中特定字符,推荐阅读《SQL如何去除某个字段中特定字符?3种常用方法解析》这篇文章。