Удаление дубликатов в MySQL

Всяческий Бред - Идти на Главную Страницу >>>

Категории:

Полезные Сведенья
Кухонная Философия
Общество и его пороки
Новости
Еда и Питье
Техника
Разное
Личное
Природа
Фото/Видео
"Веселые" Картинки
Юмор


Пишите Письма



Реклама:

Реклама

November 26, 2007

Оказывается, удалить дубликаты в SQL можно запросом с простым JOIN таблиц самой на себя:

DELETE t1 FROM sys_users t1, sys_users t2 WHERE t1.login=t2.login AND t1.ID > t2.ID


Этот запрос, если его соответствующим образом модифицировать, вполне будет работать и в MySQL, что меня, кстати, весьма удивило, ибо я ни разу не видел такого решения для удаления дубликатов, хотя нужда в этом действительно возникает достаточно часто. Обычно либо используют несколько запросов, создавая временные таблицы, либо тупо делают новую таблицу с помощью SELECT DISTINCT, потом переименовывают, удаляя старую, либо насильно навешивают уникальный ключ ALTER IGNORE TABLE table_name ADD UNIQUE INDEX (field_name) (при этом дубликаты удаляются автоматически).


На место ID нужно поставить любой уникальный ключ, который всегда есть в таблице. При этом не обязательно, чтобы ключ был автоинкрементный или вообще числовой, он вполне может быть и текстовым, сравнение ">" все равно будет работать. В общем виде запрос выглядит так:

DELETE table_name FROM table_name as table1,table_name as table2 WHERE table1.field_name=table2.field_name AND table1.unique_key>table2.unique_key


Я, правда, не уверен, что это будет работать во всех версиях MySQL, но у меня в 4й работает.

UPD: Тут реально удалял чуть более сложным запросом, понадобилось написать так:

DELETE table1 FROM zzz as table1,zzz as table2 WHERE table1.x=table2.x AND table1.y=table2.y AND table1.unique_id>table2.unique_id

Где zzz - имя таблицы, x и y - поля, которые мне надо было чтобы были парно уникальны. Основная разница с запросом, приведенным первым, в том, что пока не поставил "DELETE table1" вместо "DELETE zzz" - не работало. Учтите.



Тэги: Nov2007 Полезные сведенья

Темы, имеющие некоторое отношение к этой (русскоязычный поиск в mysql все же очень не совершенен):
Кстати, о кодировках mysql November 7, 2008
Опять об удаленных клиентах для работы с MySQL October 4, 2011
Удаленные клиенты для работы с MySQL November 7, 2008
Позор на мою седую голову June 24, 2009
Покажут ли СУП-у где раки зимуют? March 20, 2008


posted by *аноним at May 19, 2009 Свернуть
Не работает в пятой версии
posted by мини_я at April 4, 2010 Свернуть
Вроде в пятой надо писать как в самом последнем запросе. Не имя таблицы напрямую, а один из алиасов "as". В смысле, типа этого:

DELETE table1 FROM table_name as table1,table_name as table2 WHERE table1.field_name=table2.field_name AND table1.unique_key>table2.unique_key


posted by *аноним at May 27, 2009 Свернуть
А у меня в 5.0.51a работает

posted by coderov at February 19, 2011 Свернуть
не подходит для больших обьемов
уже пол часа 500к записей обрабатывает
posted by мини_я at February 19, 2011 Свернуть
Join таблицы такого размера на саму себя - это отнюдь не плевая операция. Что, собственно, ты хотел? Естественно для таблиц с таким количеством записей проще создать новую и перенести в нее записи скриптом, проверяя на дубликаты.

То же самое верно если надо сконвертить таблицу такого размера, например, из myisam в innodb. Команда смены формата напрямую может и несколько часов работать. А перенабить в новую базу - несколько минут.


пользователь: пароль:
регистрироваться  Залогинится под OpenID


Архив:

Jun2023   May2023   Apr2023   Mar2023   Feb2023   Jan2023   Dec2022   Nov2022   Oct2022   Sep2022   Aug2022   Jul2022   Jun2022   May2022   Apr2022   Mar2022   Feb2022   Jan2022   Dec2021   Nov2021   Oct2021   Sep2021   Aug2021   Jul2021   Jun2021   May2021   Apr2021   Mar2021   Feb2021   Jan2021   Dec2020   Nov2020   Oct2020   Sep2020   Aug2020   Jul2020   Jun2020   May2020   Apr2020   Mar2020   Feb2020   Jan2020   Dec2019   Nov2019   Oct2019   Sep2019   Aug2019   Jul2019   Jun2019   May2019   Apr2019   Mar2019   Feb2019   Jan2019   Dec2018   Nov2018   Oct2018   Sep2018   Aug2018   Jul2018   Jun2018   May2018   Apr2018   Mar2018   Feb2018   Jan2018   Dec2017   Nov2017   Oct2017   Sep2017   Aug2017   Jul2017   Jun2017   May2017   Apr2017   Mar2017   Feb2017   Jan2017   Dec2016   Nov2016   Oct2016   Sep2016   Aug2016   Jul2016   Jun2016   May2016   Apr2016   Mar2016   Feb2016   Jan2016   Dec2015   Nov2015   Oct2015   Sep2015   Aug2015   Jul2015   Jun2015   May2015   Apr2015   Mar2015   Feb2015   Jan2015   Dec2014   Nov2014   Oct2014   Sep2014   Aug2014   Jul2014   Jun2014   May2014   Apr2014   Mar2014   Feb2014   Jan2014   Dec2013   Nov2013   Oct2013   Sep2013   Aug2013   Jul2013   Jun2013   May2013   Apr2013   Mar2013   Feb2013   Jan2013   Dec2012   Nov2012   Oct2012   Sep2012   Aug2012   Jul2012   Jun2012   May2012   Apr2012   Mar2012   Feb2012   Jan2012   Dec2011   Nov2011   Oct2011   Sep2011   Aug2011   Jul2011   Jun2011   May2011   Apr2011   Mar2011   Feb2011   Jan2011   Dec2010   Nov2010   Oct2010   Sep2010   Aug2010   Jul2010   Jun2010   May2010   Apr2010   Mar2010   Feb2010   Jan2010   Dec2009   Nov2009   Oct2009   Sep2009   Aug2009   Jul2009   Jun2009   May2009   Apr2009   Mar2009   Feb2009   Jan2009   Dec2008   Nov2008   Oct2008   Sep2008   Aug2008   Jul2008   Jun2008   May2008   Apr2008   Mar2008   Feb2008   Jan2008   Dec2007   Nov2007   Oct2007   Sep2007   Aug2007   Jul2007   Jun2007   May2007   Apr2007   Mar2007   Feb2007   Jan2007   Dec2006   Nov2006   Oct2006   Sep2006   Aug2006   Jul2006   Jun2006   May2006