MySQL删除重复行

在数据库中,重复的行是指具有相同数据的多个行。有时候,我们可能需要删除重复的行以保持数据的一致性和准确性。MySQL提供了多种方法来删除重复的行,本文将介绍并演示其中几种常用的方法。

方法一:使用DISTINCT关键字

DISTINCT关键字用于查询结果中去除重复的行。我们可以利用这个特性来删除重复的行。

以下是示例表employees的结构:

id name age
1 Alice 25
2 Bob 30
3 Alice 25
4 Bob 30

现在我们想删除employees表中的重复行,可以使用如下SQL语句:

DELETE FROM employees
WHERE id NOT IN (
    SELECT MIN(id)
    FROM employees
    GROUP BY name, age
);

上述SQL语句中,内部的子查询SELECT MIN(id) FROM employees GROUP BY name, age用于找到每组重复行中的最小id,然后将其保留,其余的重复行将被删除。

方法二:使用临时表

另一种删除重复行的方法是使用临时表。我们可以创建一个临时表,将去除了重复行的数据插入临时表中,然后再将原表清空并将临时表中的数据重新插入原表。

以下是示例表employees的结构:

id name age
1 Alice 25
2 Bob 30
3 Alice 25
4 Bob 30

我们可以使用如下SQL语句来删除重复行:

CREATE TABLE temp_employees AS
SELECT DISTINCT *
FROM employees;

TRUNCATE TABLE employees;

INSERT INTO employees
SELECT *
FROM temp_employees;

DROP TABLE temp_employees;

上述SQL语句中,我们首先创建了一个名为temp_employees的临时表,然后使用SELECT DISTINCT * FROM employees语句将去除了重复行的数据插入到临时表中。接下来,我们清空了原表employees并使用INSERT INTO employees SELECT * FROM temp_employees语句将临时表中的数据重新插入到原表中。最后,我们删除了临时表temp_employees

方法三:使用ROW_NUMBER()函数

ROW_NUMBER()函数用于为结果集中的每一行分配一个唯一的行号。我们可以利用这个函数来删除重复的行。

以下是示例表employees的结构:

id name age
1 Alice 25
2 Bob 30
3 Alice 25
4 Bob 30

我们可以使用如下SQL语句来删除重复行:

DELETE FROM employees
WHERE (id) IN (
    SELECT id
    FROM (
        SELECT id, ROW_NUMBER() OVER (PARTITION BY name, age ORDER BY id) AS rn
        FROM employees
    ) AS t
    WHERE rn > 1
);

上述SQL语句中,内部的子查询SELECT id, ROW_NUMBER() OVER (PARTITION BY name, age ORDER BY id) AS rn FROM employees将为每组重复行添加行号,我们只保留行号大于1的行,并将其删除。

流程图

下面是删除重复行的流程图:

flowchart TD
    A[开始] --> B{选择删除方法}
    B --> C[使用DISTINCT关键字]
    B --> D[使用临时表]
    B --> E[使用ROW_NUMBER()函数]
    C --> F[执行SQL语句]
    D --> G[执行SQL语句]
    E --> H[执行SQL语句]
    F --> I[结束]
    G --> I
    H --> I

ER图

下面是示例表employees的ER图:

erDiagram
    employees {
        int id
        varchar(255) name
        int age
    }

总结

本文介绍了MySQL删除重复行的三