Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Usuń zduplikowane rekordy

Czasami może być konieczne usunięcie zduplikowanych rekordów lub usunięcie zduplikowanych wierszy w MySQL. Istnieją głównie 3 sposoby usuwania zduplikowanych rekordów w MySQL. Oto jak usunąć zduplikowane rekordy w MySQL.

MySQL Usuń zduplikowane rekordy

Oto kroki, aby usunąć zduplikowane rekordy w MySQL. Załóżmy, że masz następującą tabelę dup_orders(id, number) ze zduplikowanymi rekordami.

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

Przeczytaj bonus:Jak uzyskać zduplikowane rekordy w MySQL

Jak usunąć zduplikowane wiersze w MySQL

Przyjrzyjmy się każdemu z 3 sposobów usuwania zduplikowanych rekordów w MySQL.

1. Usuń zduplikowane rekordy za pomocą tabeli pośredniej

Ta metoda obejmuje 3 kroki. Najpierw wybierz wiersze bez duplikatów z dup_orders tabeli i wstaw je do innej tabeli. Oto jego składnia.

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

Oto nasze zapytanie, aby wybrać różne wiersze z dup_orders do innej tabeli.

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

Powyższe zapytanie usuwa wiersze, które uzupełniają duplikaty, czyli zduplikowane wartości dla wszystkich kolumn.

Jeśli chcesz usunąć wiersze ze zduplikowanymi wartościami tylko dla jednej lub więcej, ale nie wszystkich kolumn, możesz użyć klauzuli GROUP BY w powyższym zapytaniu. Na przykład, jeśli chcesz tylko wiersze ze zduplikowanymi wartościami kolumn identyfikatora w tabeli, użyj następującego zapytania.

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

Po utworzeniu tabeli pośredniej usuń oryginalną tabelę.

mysql> drop table dup_orders;

Na koniec zmień nazwę tabeli pośredniej na oryginalną.

mysql> alter table dup_orders_copy rename to dup_orders;

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

Przeczytaj bonus:MySQL Dodaj unikatowe ograniczenie

2. Usuń zduplikowane wiersze za pomocą INNER JOIN

Możesz również usunąć zduplikowane wiersze, używając kombinacji instrukcji DELETE i INNER JOIN. Jednak w tym przypadku Twoja tabela musi mieć co najmniej jedną unikatową kolumnę (np. klucz podstawowy). Załóżmy, że masz następujące dup_orders tabela ze zduplikowaną kwotą wartości, ale unikalny id wartości.

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

Możesz połączyć powyższą tabelę ze sobą za pomocą INNER JOIN i usunąć zduplikowane wiersze za pomocą następującego zapytania.

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

Powyższe zapytanie zachowa najwyższy identyfikator wiersza dla każdego zduplikowanego wiersza. Jeśli chcesz zachować wiersz o najniższym identyfikatorze, użyj następującego zapytania.

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

Przeczytaj bonus:kolumna zmiany nazwy MySQL

3. Usuń zduplikowane rekordy za pomocą ROW_NUMBER()

Możesz także usunąć zduplikowane rekordy z tabeli za pomocą funkcji ROW_NUMBER(), dostępnej od 8.0.2. Oto zapytanie SQL, aby uzyskać numery zduplikowanych wierszy

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

Oto zapytanie, aby uzyskać numer wiersza dla tabeli dup_orders

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

Użyjemy tego jako zapytania podrzędnego w naszym zapytaniu SQL, aby usunąć zduplikowane wiersze, jak pokazano poniżej

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
)

Mamy nadzieję, że teraz możesz łatwo usuwać zduplikowane rekordy w MySQL.

Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO MySQL:użyć PDO::ATTR_EMULATE_PREPARES czy nie?

  2. Jak działa funkcja RTRIM() w MySQL

  3. Czy mysql_real_escape_string() W PEŁNI chroni przed wstrzyknięciem SQL?

  4. Symulacja polecenia ORDER BY FIELD() MySQL w Postgresql

  5. Odmowa dostępu dla użytkownika „root”@„localhost” podczas próby nadania uprawnień. Jak nadawać uprawnienia?