MySQL处理重复数据
概述
重复数据可能导致数据完整性问题和性能问题。MySQL提供了多种方法来查找、预防和处理表中的重复记录。
重复类型
完全重复:所有列相同 部分重复:部分列相同 主键重复:重复的主键 唯一键重复:重复的唯一约束 业务重复:逻辑重复(同一人多次)
预防重复
主键约束
sql
-- Prevent exact row duplicates
-- Insert attempt with duplicate primary key fails
-- Error: Duplicate entry for key 'PRIMARY'唯一约束
sql
-- Prevent duplicate values in specific columns
-- Insert duplicate email fails
-- Error: Duplicate entry for key 'email'复合唯一约束
sql
-- Prevent combination duplicates
-- Insert duplicate user_id + email_type fails
-- Error: Duplicate entry for key 'user_id'查找重复
GROUP BY方法
sql
-- Find duplicates by specific column
-- Find all columns that are duplicates子查询方法
sql
-- Find duplicate records
-- Show one instance per duplicate自连接方法
sql
-- Find duplicate records using self-join
-- Count duplicates per value删除重复
使用自连接删除
sql
-- Keep the lowest ID for each duplicate
-- Check deleted count使用子查询删除
sql
-- Delete duplicates, keep first occurrence
-- Delete duplicates, keep highest ID使用临时表删除
sql
-- Create temporary table with unique records
-- Truncate original table
-- Insert unique recordsINSERT IGNORE / INSERT IGNORE
跳过重复错误
sql
-- Ignore duplicate errors
-- Check affected rowsREPLACE INTO / REPLACE INTO
替换现有记录
sql
-- Replace if duplicate key exists
-- Equivalent to DELETE + INSERT
-- If id=1 exists, delete it, then insert new recordON DUPLICATE KEY UPDATE / ON DUPLICATE KEY UPDATE
重复时更新
sql
-- Update if duplicate key exists
-- Insert with multiple values高级ON DUPLICATE KEY UPDATE
sql
-- Increment counter on duplicate
-- Conditional update实用示例
示例1:清理联系人列表
sql
-- Find duplicate emails
-- Remove duplicates, keep most recent示例2:合并重复记录
sql
-- Merge duplicate users
-- Create table for merged records
-- Insert merged records
-- Delete old duplicates示例3:导入数据
sql
-- Import with duplicate handling
-- Import unique records
-- Or update existing records示例4:每日去重
sql
-- Create deduplicated view
-- Use view instead of table重复预防策略
数据库设计
sql
-- Add unique constraints
-- Add composite unique for business logic应用程序逻辑
sql
-- Check before insert
-- Step 1: Check exists
-- Step 2: Insert if not exists预防的触发器
sql
-- Prevent duplicate inserts监控重复
重复检测查询
sql
-- Find duplicates across all tables定期重复检查
sql
-- Create procedure to check duplicates
-- Run regularly最佳实践
选择去重方法
sql
-- Use INSERT IGNORE for:
-- - Simple insert operations
-- - Want to skip duplicates silently
-- Use REPLACE for:
-- - Complete row replacement
-- - Need to delete old record completely
-- Use ON DUPLICATE KEY UPDATE for:
-- - Update existing records
-- - Merge data
-- - Keep history with update timestamp性能考虑
sql
-- Large deduplication operations
-- Use temporary tables for better performance
-- Add indexes to temporary table
-- Delete in batches小结
在MySQL中处理重复涉及:
预防:主键、唯一约束 检测:GROUP BY、自连接、子查询 删除:带连接的DELETE、临时表 插入处理:INSERT IGNORE、REPLACE、ON DUPLICATE KEY UPDATE 监控:定期检查数据质量
根据数据完整性需求和性能需求选择适当的方法。
上一个:序列
下一个:SQL注入