Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL entfernt doppelte Datensätze

Manchmal müssen Sie möglicherweise doppelte Datensätze entfernen oder doppelte Zeilen in MySQL löschen. Es gibt hauptsächlich 3 Möglichkeiten, doppelte Datensätze in MySQL zu löschen. So entfernen Sie doppelte Einträge in MySQL.

MySQL entfernt doppelte Einträge

Hier sind die Schritte zum Entfernen doppelter Datensätze in MySQL. Nehmen wir an, Sie haben die folgende Tabelle dup_orders(id, amount) mit doppelten Datensätzen.

mysql> create table dup_orders(id int, amount int);

mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
|    2 |    350 |
+------+--------+

Bonuslektüre:So erhalten Sie doppelte Datensätze in MySQL

So löschen Sie doppelte Zeilen in MySQL

Sehen wir uns jede der 3 Möglichkeiten an, um doppelte Einträge in MySQL zu löschen.

1. Entfernen Sie doppelte Datensätze mithilfe der Zwischentabelle

Diese Methode umfasst 3 Schritte. Wählen Sie zuerst Zeilen ohne Duplikate aus dup_orders aus Tabelle und fügen Sie sie in eine andere Tabelle ein. Hier ist die Syntax dafür.

CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];

Hier ist unsere Abfrage, um verschiedene Zeilen aus dup_orders in einer anderen Tabelle auszuwählen.

mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
+------+--------+

Die obige Abfrage entfernt Zeilen, die vollständige Duplikate sind, d. h. doppelte Werte für alle Spalten.

Wenn Sie Zeilen mit doppelten Werten für nur eine oder mehrere, aber nicht alle Spalten entfernen möchten, können Sie in der obigen Abfrage eine GROUP BY-Klausel verwenden. Wenn Sie beispielsweise nur Zeilen mit doppelten ID-Spaltenwerten in Ihrer Tabelle anzeigen möchten, verwenden Sie die folgende Abfrage.

mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Nachdem Sie die Zwischentabelle erstellt haben, löschen Sie die ursprüngliche Tabelle.

mysql> drop table dup_orders;

Benennen Sie schließlich die Zwischentabelle in die ursprüngliche Tabelle um.

mysql> alter table dup_orders_copy rename to dup_orders;

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Bonus-Lesetext:MySQL fügt eindeutige Einschränkung hinzu

2. Entfernen Sie doppelte Zeilen mit INNER JOIN

Sie können auch doppelte Zeilen entfernen, indem Sie eine Kombination aus DELETE- und INNER JOIN-Anweisungen verwenden. In diesem Fall muss Ihre Tabelle jedoch mindestens eine eindeutige Spalte (z. B. Primärschlüssel) haben. Angenommen, Sie haben die folgenden dup_orders Tabelle mit doppeltem Betrag Werte, aber eindeutige id Werte.

mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    3 |    350 |
|    4 |    350 |
+------+--------+

Sie können die obige Tabelle mit einem INNER JOIN mit sich selbst verknüpfen und mit der folgenden Abfrage doppelte Zeilen löschen.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id < t2.id 
           AND t1.amount = t2.amount;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    4 |    350 |
+------+--------+

Die obige Abfrage behält die höchste Zeilen-ID für jede doppelte Zeile bei. Wenn Sie die Zeile mit der niedrigsten ID beibehalten möchten, verwenden Sie die folgende Abfrage.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id >> t2.id 
           AND t1.amount = t2.amount;

Bonus-Lesetext:MySQL-Umbenennungsspalte

3. Entfernen Sie doppelte Datensätze mit ROW_NUMBER()

Sie können auch doppelte Datensätze aus der Tabelle entfernen, indem Sie die Funktion ROW_NUMBER() verwenden, die seit 8.0.2 verfügbar ist. Hier ist die SQL-Abfrage, um Zeilennummern von doppelten Zeilen abzurufen

SELECT *. ROW_NUMBER () Over (PARTITION BY [column] 
ORDER BY [column]) as [row_number_name];

Hier ist die Abfrage zum Abrufen der Zeilennummer für die Tabelle dup_orders

SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) 
as row_number from dup_orders;

Wir werden dies als Unterabfrage in unserer SQL-Abfrage verwenden, um doppelte Zeilen zu löschen, wie unten gezeigt

DELETE FROM dup_orders
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id, 
            ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number 
           from dup_orders
    ) t
    WHERE row_number > 1
)

Hoffentlich können Sie jetzt doppelte Einträge in MySQL einfach entfernen.

Ubiq macht es einfach, Daten innerhalb von Minuten zu visualisieren und in Echtzeit-Dashboards zu überwachen. Probieren Sie es noch heute aus!