sql >> Database >  >> RDS >> Mysql

MySQL Verwijder dubbele records

Soms moet u dubbele records verwijderen of dubbele rijen verwijderen in MySQL. Er zijn hoofdzakelijk 3 manieren om dubbele records in MySQL te verwijderen. Hier leest u hoe u dubbele records in MySQL verwijdert.

MySQL dubbele records verwijderen

Hier zijn de stappen om dubbele records in MySQL te verwijderen. Stel dat u de volgende tabel dup_orders(id, bedrag) . heeft met dubbele records.

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 |
+------+--------+

Bonus lezen:dubbele records in MySQL krijgen

Dubbele rijen verwijderen in MySQL

Laten we eens kijken naar elk van de 3 manieren om dubbele records in MySQL te verwijderen.

1. Verwijder dubbele records met behulp van tussentabel

Deze methode omvat 3 stappen. Selecteer eerst rijen zonder duplicaten, uit dup_orders tabel en plaats ze in een andere tabel. Hier is de syntaxis ervoor.

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

Dit is onze vraag om afzonderlijke rijen van dup_orders naar een andere tabel te selecteren.

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 |
+------+--------+

De bovenstaande zoekopdracht verwijdert rijen die dubbel zijn, dat wil zeggen dubbele waarden voor alle kolommen.

Als u rijen met dubbele waarden voor slechts een of meer maar niet alle kolommen wilt verwijderen, kunt u een GROUP BY-component in de bovenstaande query gebruiken. Als u bijvoorbeeld alleen rijen met dubbele ID-kolomwaarden in uw tabel wilt gebruiken, gebruikt u de volgende query.

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 |
+------+--------+

Zodra u de tussenliggende tabel heeft gemaakt, laat u de originele tabel vallen.

mysql> drop table dup_orders;

Hernoem tot slot de tussentabel naar de originele tafel.

mysql> alter table dup_orders_copy rename to dup_orders;

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

Bonus Lezen:MySQL Voeg Unieke Constain toe

2. Verwijder dubbele rijen met INNER JOIN

U kunt dubbele rijen ook verwijderen door een combinatie van DELETE- en INNER JOIN-instructies te gebruiken. In dit geval moet uw tabel echter ten minste één unieke kolom hebben (bijv. primaire sleutel). Stel dat u de volgende dup_orders . heeft tabel met dubbel bedrag waarden maar unieke id waarden.

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 |
+------+--------+

U kunt de bovenstaande tabel met zichzelf samenvoegen met behulp van een INNER JOIN en dubbele rijen verwijderen met de volgende query.

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 |
+------+--------+

De bovenstaande query behoudt de hoogste id van de rij voor elke dubbele rij. Als u de rij met de laagste id wilt behouden, gebruikt u de volgende zoekopdracht.

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

Bonus Lezen:MySQL Kolom hernoemen

3. Verwijder dubbele records met ROW_NUMBER()

U kunt ook dubbele records uit de tabel verwijderen met de functie ROW_NUMBER(), beschikbaar sinds 8.0.2. Hier is de SQL-query om rijnummers van dubbele rijen te krijgen

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

Dit is de vraag om het rijnummer voor de dup_orders-tabel te krijgen

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

We zullen dit gebruiken als een subquery in onze SQL-query om dubbele rijen te verwijderen, zoals hieronder weergegeven

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
)

Hopelijk kunt u nu gemakkelijk dubbele records in MySQL verwijderen.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. De kosten van gratis PostgreSQL-publiciteit

  2. Verstuur e-mails met bijlagen in SQL Server (T-SQL)

  3. Fix "INSERT heeft meer expressies dan doelkolommen" in PostgreSQL

  4. Automatisering van MySQL-databaseimplementatie