上一篇
场景引入:
"小王,为什么报表里的客户数量比实际多了一倍?" 凌晨2点,运维小哥盯着屏幕欲哭无泪——又是重复数据惹的祸!😫 如果你也经常被MSSQL中的重复记录困扰,这篇实战指南就是你的"数据救心丸"!
常见症状:
快速诊断(举个🌰):
-- 检查表中是否存在重复姓名+手机号的记录 SELECT 姓名, 手机号, COUNT(*) FROM 客户表 GROUP BY 姓名, 手机号 HAVING COUNT(*) > 1
适用场景:需要保留最新/最旧的一条记录
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 姓名,手机号 ORDER BY 创建时间 DESC) AS rn FROM 客户表 ) DELETE FROM CTE WHERE rn > 1
💡 优点:可灵活指定保留规则(DESC留最新/ASC留最旧)
适用场景:简单结构的表快速去重
-- 创建临时表存储唯一记录 SELECT DISTINCT 字段1, 字段2 INTO #TempTable FROM 原表 -- 清空原表后插回 TRUNCATE TABLE 原表 INSERT INTO 原表 SELECT * FROM #TempTable
⚠️ 注意:操作前务必备份数据!
适用场景:需要同步更新其他字段
MERGE INTO 目标表 AS target USING (SELECT DISTINCT 关键字段 FROM 原表) AS source ON target.关键字段 = source.关键字段 WHEN NOT MATCHED THEN INSERT (字段列表) VALUES (值列表);
预防胜于治疗:
-- 添加唯一约束(已有重复数据时会报错) ALTER TABLE 订单表 ADD CONSTRAINT UQ_订单号 UNIQUE (订单编号)
🛡️ 效果:后续插入重复数据会直接失败
适合:ETL过程自动处理
SELECT
确认再DELETE
,避免误删 PRIMARY KEY
TRY...CATCH
捕获重复插入异常 📌 最新实践建议(2025-08更新):
SQL Server 2025新增的DEDUPLICATE
语法可简化去重操作,但需要兼容级别160+
最后叮嘱:处理生产数据前,一定要先BEGIN TRANSACTION
测试!毕竟...删库容易恢复难啊!🙈 (别问我是怎么知道的)
本文由 从玟玉 于2025-08-03发表在【云服务器提供商】,文中图片由(从玟玉)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/521759.html
发表评论