sql >> Databasteknik >  >> RDS >> Mysql

MySQL Ta bort dubbletter av poster

Ibland kan du behöva ta bort dubblettposter eller ta bort dubblettrader i MySQL. Det finns huvudsakligen 3 sätt att ta bort dubbletter av poster i MySQL. Så här tar du bort dubbletter av poster i MySQL.

MySQL Remove Duplicate Records

Här är stegen för att ta bort dubbletter av poster i MySQL. Låt oss säga att du har följande tabell dup_orders(id, summa) med dubbletter av poster.

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 Läs:Hur man får dubbletter av poster i MySQL

Hur man tar bort dubbletter av rader i MySQL

Låt oss titta på vart och ett av de tre sätten att ta bort dubbletter av poster i MySQL.

1. Ta bort dubbletter av poster med hjälp av mellantabell

Denna metod omfattar 3 steg. Välj först rader utan dubbletter, från dup_orders tabell och sätt in dem i en annan tabell. Här är syntaxen för det.

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

Här är vår fråga för att välja distinkta rader från dup_orders till en annan tabell.

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

Ovanstående fråga tar bort rader som slutför dubbletter, det vill säga dubbletter av värden för alla kolumner.

Om du vill ta bort rader med dubbletter av värden för bara en eller flera men inte alla kolumner, kan du använda en GROUP BY-sats i ovanstående fråga. Om du till exempel bara vill rader med dubbletter av ID-kolumnvärden i din tabell, använd följande fråga.

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

När du har skapat den mellanliggande tabellen, släpp den ursprungliga tabellen.

mysql> drop table dup_orders;

Slutligen, byt namn på mellantabell till originaltabell.

mysql> alter table dup_orders_copy rename to dup_orders;

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

Bonusläsning:MySQL Lägg till unik begränsning

2. Ta bort dubbletter av rader med INNER JOIN

Du kan också ta bort dubbletter av rader med en kombination av DELETE- och INNER JOIN-satser. Men i det här fallet måste din tabell ha minst en unik kolumn (t.ex. primärnyckel). Låt oss säga att du har följande dup_orders tabell med dubblett av belopp värden men unikt id värden.

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

Du kan gå med i tabellen ovan med sig själv med en INNER JOIN och ta bort dubbletter av rader med hjälp av följande fråga.

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

Ovanstående fråga kommer att behålla radens högsta ID för varje dubblettrad. Om du vill behålla raden med lägsta id, använd följande fråga.

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

Bonusläsning:MySQL Byt namn på kolumn

3. Ta bort dubbletter av poster med ROW_NUMBER()

Du kan också ta bort dubblettposter från tabellen med ROW_NUMBER()-funktionen, tillgänglig sedan 8.0.2. Här är SQL-frågan för att få radnummer med dubbletter av rader

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

Här är frågan för att få radnummer för dup_orders-tabellen

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

Vi kommer att använda detta som en underfråga i vår SQL-fråga för att ta bort dubbletter av rader, som visas nedan

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
)

Förhoppningsvis kan du nu enkelt ta bort dubbletter av poster i MySQL.

Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. MySQL strippar icke-numeriska tecken för att jämföra

  2. 4 sätt att skydda känslig information från dina kunder

  3. Hur får man en lista kolumnnamn och datatyper för en tabell i PostgreSQL?

  4. Hur man släpper eller tar bort alla utlösare från en databas i SQL Server