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

Usunąć wszystkie zduplikowane wiersze z wyjątkiem jednego w MySQL?

Ostrzeżenie edytora:to rozwiązanie jest niewydajne obliczeniowo i może spowodować przerwanie połączenia w przypadku dużej tabeli.

Uwaga – potrzebujesz zrobić to najpierw na kopii testowej Twojego stołu!

Kiedy to zrobiłem, stwierdziłem, że chyba że dodałem również AND n1.id <> n2.id , usunął każdy wiersz w tabeli.

  1. Jeśli chcesz zachować wiersz z najniższym id wartość:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Jeśli chcesz zachować wiersz z najwyższym id wartość:

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    

Użyłem tej metody w MySQL 5.1

Nie jestem pewien co do innych wersji.

Aktualizacja:ponieważ ludzie szukający w Google usuwania duplikatów trafiają tutaj
Chociaż pytanie OP dotyczy DELETE , należy pamiętać, że przy użyciu INSERT i DISTINCT jest znacznie szybszy. W przypadku bazy danych z 8 milionami wierszy poniższe zapytanie zajęło 13 minut przy użyciu DELETE , zajęło to ponad 2 godziny, a mimo to nie zostało ukończone.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy używać WYBIERZ... DO AKTUALIZACJI?

  2. PERIOD_DIFF() Przykłady – MySQL

  3. Adminer — zaawansowane narzędzie do administrowania bazami danych oparte na sieci WWW dla systemu Linux

  4. Ruby on Rails 3 Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/tmp/mysql.sock' w systemie OSX

  5. Uzyskaj pierwsze n rekordów dla każdej grupy zgrupowanych wyników