2012-03-15 2 views
1

Я способен отображать дубликаты в моей таблицеMysql удалить дубликаты

имя таблицы reportingdetail и имя столбца ReportingDetailID

SELECT DISTINCT ReportingDetailID from reportingdetail group by ReportingDetailID HAVING count(ReportingDetailID) > 1; 
+-------------------+ 
| ReportingDetailID | 
+-------------------+ 
|   664602311 | 
+-------------------+ 
1 row in set (2.81 sec) 

Доза кто-нибудь знает, как я могу идти о удаление дубликатов и сохранение только одной записи?

Я усталое следующее

SELECT * FROM reportingdetail USING reportingdetail, reportingdetail AS vtable WHERE  (reportingdetailID > vtable.id) AND (reportingdetail.reportingdetailID=reportingdetailID); 

Но это только удалено все и все одиночные дубликаты записей!

+0

Вы можете показать схему таблицы и что делает что-то дублирующее и то, что вы хотите сохранить? – kaj

+0

Возможный дубликат [Как удалить дубликаты в таблице MySQL] (http://stackoverflow.com/questions/672702/how-to-delete-duplicates-in-mysql-table) –

ответ

3

Самый быстрый способ (что я знаю) удалить дубликаты в MySQL - это добавить индекс.

Е.Г., предполагая reportingdetailID собирается быть PK для этой таблицы:

mysql> ALTER IGNORE TABLE reportingdetail 
    -> ADD PRIMARY KEY (reportingdetailID); 

От documentation:

ИГНОРИРУЙТЕ является расширение MySQL для стандартного SQL. Он контролирует, как ALTER TABLE работает, если есть дубликаты уникальных ключей в новой таблице или , если предупреждения возникают, когда включен строгий режим. Если IGNORE не указан , копия отменяется и откатывается, если возникают ошибки с дублирующими ключами . Если указана IGNORE, то используется только первая строка строк с дубликатами на уникальном ключе. Остальные конфликтующие строки удаляются. Неверные значения усекаются до ближайшего подходящего значения .

Добавление этого индекса приведет к удалению дубликатов и предотвращению вставки любых будущих дубликатов. Если вы не хотите последнего поведения, просто снимите индекс после его создания.

0

Это должно дать вам дубликаты записей.

SELECT `ReportingDetailID`, COUNT(`ReportingDetailID`) AS Nummber_of_Occurrences FROM reportingdetail GROUP BY `ReportingDetailID` HAVING (COUNT(`ReportingDetailID`) > 1) 
+0

От OP: «Я в состоянии для отображения дубликатов в моей таблице "- проблема заключается в их удалении. – RedFilter

+0

Ну, если вы можете их выбрать, вы можете удалить их с помощью Delete ... where ...Выбрать – PoX

1

Следующие команды MySQL создает временную таблицу и заполнить его со всеми столбцами, сгруппированных одним именем столбца (столбец, который имеет дубликаты) и заказать их по первичному ключу по возрастанию. Вторая команда создает реальную таблицу из временной таблицы. Третья команда отменяет используемую таблицу и, наконец, последняя команда переименовывает вторую временную таблицу в текущее используемое имя таблицы.

Это действительно быстрое решение. Вот четыре команды:

CREATE TEMPORARY TABLE videos_temp AS SELECT * FROM videos GROUP by 
    title ORDER BY videoid ASC; 
CREATE TABLE videos_temp2 AS SELECT * FROM videos_temp; 
DROP TABLE videos; 
ALTER TABLE videos_temp2 RENAME videos;