MySQL 处理重复数据详细说明
目录
MySQL 处理重复数据详细说明
一、防止重复数据(预防阶段)
二、识别重复数据(检测阶段)
三、删除重复数据(清理阶段)
四、合并重复数据(更新阶段)
关键注意事项
MySQL 处理重复数据详细说明
在数据库操作中,重复数据可能导致数据冗余、查询效率降低和统计误差。MySQL 提供了多种处理重复数据的方法,以下按操作流程详细说明:
一、防止重复数据(预防阶段)
-
主键约束
创建表时定义主键,确保每行唯一标识:CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, -- 主键列email VARCHAR(255) NOT NULL,UNIQUE (email) -- 唯一约束 );
- 插入重复数据时会报错:
ERROR 1062 (23000): Duplicate entry 'xxx' for key 'email'
- 插入重复数据时会报错:
-
唯一索引
对非主键列添加唯一性约束:ALTER TABLE orders ADD UNIQUE (order_number);
- 支持多列组合唯一性:
ADD UNIQUE idx_name (col1, col2)
- 支持多列组合唯一性:
-
INSERT IGNORE
忽略重复插入(不报错):INSERT IGNORE INTO products (sku, name) VALUES ('A100', 'Laptop');
-
REPLACE INTO
覆盖重复记录(先删除再插入):REPLACE INTO inventory (item_id, stock) VALUES (101, 50);
二、识别重复数据(检测阶段)
-
GROUP BY + HAVING
统计重复值的数量和内容:SELECT email, COUNT(*) AS duplicates FROM customers GROUP BY email HAVING duplicates > 1;
-
自连接查询
定位具体重复行:SELECT a.* FROM employees a JOIN employees b ON a.phone = b.phone AND a.id <> b.id; -- 排除自身
三、删除重复数据(清理阶段)
-
临时表法
适用于所有MySQL版本:-- 创建临时表存储唯一数据 CREATE TABLE tmp SELECT DISTINCT * FROM sales;-- 清空原表并插入去重数据 TRUNCATE TABLE sales; INSERT INTO sales SELECT * FROM tmp;DROP TABLE tmp; -- 清理临时表
-
ROW_NUMBER() 窗口函数(MySQL 8.0+)
高效删除重复行:DELETE FROM logs WHERE id IN (SELECT id FROM (SELECT id, ROW_NUMBER() OVER (PARTITION BY log_time, message) AS rnFROM logs) t WHERE t.rn > 1 -- 保留第一条,删除后续重复项 );
四、合并重复数据(更新阶段)
使用 ON DUPLICATE KEY UPDATE
合并冲突数据:
INSERT INTO user_scores (user_id, score)
VALUES (123, 50)
ON DUPLICATE KEY UPDATE score = score + VALUES(score); -- 分数累加
- 适用场景:计数器更新、状态覆盖等
关键注意事项
-
性能影响
删除大表重复数据时:- 在低峰期操作
- 使用
LIMIT
分批删除(如每次 1000 行) - 提前备份:
CREATE TABLE backup AS SELECT * FROM original
-
唯一性选择
根据业务需求决定唯一约束粒度:- 单列唯一(如身份证号)
- 多列组合唯一(如
(date, product_id)
)
-
NULL 值处理
MySQL 中唯一索引允许存在多个NULL
值(视为不同值),需注意业务逻辑。
通过合理设计表结构、利用约束机制和选择适当清理策略,可有效管理MySQL中的重复数据问题。