Mysql
 sql >> база данни >  >> RDS >> Mysql

Изтриване на всички дублиращи се редове с изключение на един в MySQL?

Предупреждение на редактора:Това решение е изчислително неефективно и може да развали връзката ви за голяма маса.

NB – Вие необходим за да направите това първо на тестово копие на вашата маса!

Когато го направих, установих, че освен ако не включих също AND n1.id <> n2.id , той изтри всеки ред в таблицата.

  1. Ако искате да запазите реда с най-ниския id стойност:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Ако искате да запазите реда с най-висок id стойност:

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

Използвах този метод в MySQL 5.1

Не съм сигурен за други версии.

Актуализация:Тъй като хората, търсещи в Google за премахване на дубликати, се озовават тук
Въпреки че въпросът на ОП е за DELETE , имайте предвид, че използвате INSERT и DISTINCT е много по-бързо. За база данни с 8 милиона реда заявката по-долу отне 13 минути, докато се използва DELETE , отне повече от 2 часа и все пак не завърши.

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. Анализирайте датата в MySQL

  2. MySQL - Направете съществуващо поле уникално

  3. mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows и т.н.... очаква параметър 1 да бъде ресурс

  4. JSON_OBJECTAGG() – Създайте JSON обект от резултатите от заявката в MySQL

  5. Как да видя всички външни ключове към таблица или колона?