sql >> Databáze >  >> RDS >> Mysql

MySQL odstraňuje duplicitní záznamy

Někdy může být nutné odstranit duplicitní záznamy nebo odstranit duplicitní řádky v MySQL. Existují především 3 způsoby, jak odstranit duplicitní záznamy v MySQL. Zde je návod, jak odstranit duplicitní záznamy v MySQL.

MySQL odstraní duplicitní záznamy

Zde jsou kroky k odstranění duplicitních záznamů v MySQL. Řekněme, že máte následující tabulku dup_orders(id, částka) s duplicitními záznamy.

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

Bonusové čtení:Jak získat duplicitní záznamy v MySQL

Jak odstranit duplicitní řádky v MySQL

Podívejme se na každý ze 3 způsobů, jak odstranit duplicitní záznamy v MySQL.

1. Odstraňte duplicitní záznamy pomocí přechodné tabulky

Tato metoda zahrnuje 3 kroky. Nejprve vyberte řádky bez duplikátů z dup_orders tabulky a vložte je do jiné tabulky. Zde je jeho syntaxe.

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

Zde je náš dotaz na výběr odlišných řádků z dup_orders do jiné tabulky.

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

Výše uvedený dotaz odstraní řádky, které dokončují duplicitu, tedy duplicitní hodnoty pro všechny sloupce.

Pokud chcete odstranit řádky s duplicitními hodnotami pouze pro jeden nebo více, ale ne všechny sloupce, můžete ve výše uvedeném dotazu použít klauzuli GROUP BY. Pokud například chcete v tabulce zobrazit pouze řádky s duplicitními hodnotami sloupce ID, použijte následující dotaz.

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

Jakmile vytvoříte přechodnou tabulku, zrušte původní tabulku.

mysql> drop table dup_orders;

Nakonec přejmenujte přechodnou tabulku na původní tabulku.

mysql> alter table dup_orders_copy rename to dup_orders;

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

Bonusové čtení:MySQL Add Unique Constain

2. Odstraňte duplicitní řádky pomocí INNER JOIN

Můžete také odstranit duplicitní řádky pomocí kombinace příkazů DELETE a INNER JOIN. V tomto případě však vaše tabulka musí mít alespoň jeden jedinečný sloupec (např. primární klíč). Řekněme, že máte následující dup_orders tabulka s duplicitním částkou hodnoty, ale jedinečné id hodnoty.

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

Výše uvedenou tabulku můžete připojit k sobě pomocí INNER JOIN a odstranit duplicitní řádky pomocí následujícího dotazu.

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

Výše uvedený dotaz zachová nejvyšší ID řádku pro každý duplicitní řádek. Pokud chcete zachovat řádek s nejnižším id, použijte následující dotaz.

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

Bonusové čtení:Sloupec přejmenování MySQL

3. Odstraňte duplicitní záznamy pomocí ROW_NUMBER()

Můžete také odstranit duplicitní záznamy z tabulky pomocí funkce ROW_NUMBER() dostupné od 8.0.2. Zde je dotaz SQL pro získání čísel řádků duplicitních řádků

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

Zde je dotaz na získání čísla řádku pro tabulku dup_orders

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

Použijeme to jako dílčí dotaz v našem SQL dotazu k odstranění duplicitních řádků, jak je uvedeno níže

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
)

Doufejme, že nyní můžete snadno odstranit duplicitní záznamy v MySQL.

Ubiq usnadňuje vizualizaci dat během několika minut a sledování na řídicích panelech v reálném čase. Vyzkoušejte to ještě dnes!

  1. Jak připojit databázi Oracle z PHP

  2. Jak automaticky vygenerovat jedinečné ID v SQL, jako je UID12345678?

  3. Jak mohu zrušit všechny tabulky v databázi PostgreSQL?

  4. Seskupování klauzulí WHERE v Codeigniter