MySQL中高效删除重复数据的三种SQL策略

在MySQL中删除重复数据可以通过多种方法实现。以下是三种常见的SQL写法:

图片[1]_MySQL中高效删除重复数据的三种SQL策略_知途无界

方法一:使用子查询和自连接

这种方法利用子查询和表自连接来找出重复的行,并删除它们,只保留一行。

DELETE t1 FROM your_table t1
INNER JOIN your_table t2 
WHERE 
  t1.id < t2.id AND 
  t1.some_column = t2.some_column;

在这个例子中,your_table 是你的表名,id 是主键或唯一标识符,some_column 是你用来判断重复数据的列。这个查询会删除所有重复的行,只保留每组重复数据中的一行(通常是 id 值最大的那一行,因为条件是 t1.id < t2.id)。

方法二:使用ROW_NUMBER()窗口函数(适用于MySQL 8.0及以上版本)

这种方法利用了MySQL 8.0引入的窗口函数功能。

WITH cte AS (
  SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY some_column ORDER BY id) AS rn
  FROM 
    your_table
)
DELETE FROM your_table
WHERE id IN (
  SELECT id FROM cte WHERE rn > 1
);

在这个例子中,ROW_NUMBER() 函数为每组重复数据分配一个唯一的行号(根据 some_column 分区,并根据 id 排序)。然后,外部查询删除所有行号大于1的行,即删除重复的行。

方法三:使用临时表和INSERT IGNORE或REPLACE INTO(适用于需要保持数据完整性的情况)

这种方法首先将数据插入到一个临时表中,然后使用 INSERT IGNORE 或 REPLACE INTO 来避免插入重复数据。

CREATE TEMPORARY TABLE temp_table AS
SELECT DISTINCT * FROM your_table;

TRUNCATE TABLE your_table;

INSERT INTO your_table SELECT * FROM temp_table;

DROP TEMPORARY TABLE temp_table;

或者,如果表有唯一键约束,可以使用 REPLACE INTO

CREATE TEMPORARY TABLE temp_table AS
SELECT * FROM your_table;

REPLACE INTO your_table SELECT * FROM temp_table;

DROP TEMPORARY TABLE temp_table;

请注意,REPLACE INTO 会在发现重复键时删除旧行并插入新行,这可能会导致自增主键的值跳跃。因此,在使用 REPLACE INTO 时要特别小心。

在实际应用中,选择哪种方法取决于你的具体需求、MySQL的版本以及你对数据完整性的要求。在删除数据之前,始终建议备份数据库,以防万一。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞16 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容