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 Полезные сведенья
posted by *аноним at May 19, 2009 СвернутьНе работает в пятой версии
posted by мини_я at April 3, 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. Команда смены формата напрямую может и несколько часов работать. А перенабить в новую базу - несколько минут.
Архив:
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 |