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

Smazat všechny duplicitní řádky kromě jednoho v MySQL?

Upozornění editora:Toto řešení je výpočetně neefektivní a může způsobit výpadek připojení u velkého stolu.

Poznámka – potřebujete to nejprve na zkušební kopii vašeho stolu!

Když jsem to udělal, zjistil jsem, že pokud jsem nezahrnul také AND n1.id <> n2.id , smazal každý řádek v tabulce.

  1. Pokud chcete zachovat řádek s nejnižším id hodnota:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. Pokud chcete zachovat řádek s nejvyšším id hodnota:

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

Tuto metodu jsem použil v MySQL 5.1

U jiných verzí si nejsem jistý.

Aktualizace:Protože lidé, kteří pomocí Googlu odebírají duplikáty, končí zde
Přestože otázka OP se týká DELETE , mějte na paměti, že pomocí INSERT a DISTINCT je mnohem rychlejší. U databáze s 8 miliony řádků trval níže uvedený dotaz 13 minut při použití DELETE , trvalo to více než 2 hodiny a přesto nebylo dokončeno.

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



  1. Číslo řádku na skupinu v mysql

  2. Rychlejší alternativa v Oracle k SELECT COUNT(*) FROM sometable

  3. Kdy je lepší ukládat příznaky jako bitovou masku, než používat asociativní tabulku?

  4. java.lang.IllegalArgumentException:sloupec '_id' neexistuje