0

Я пытаюсь удалить повторяющиеся строки из таблицы, но все мои усилия либо приводят к ошибке, либо застревают во время выполнения. Мой стол содержит 16,8 миллиона записей, включая 1,5 миллиона дубликатов. Структура таблицы выглядит следующим образомУдалить повторяющиеся строки MySQL

-------------------------------------- 
| id | number | city | region | site | 
-------------------------------------- 
| 1 | 12345 | abc | xyz | 321 | 
| 2 | 67890 | def | axc | 167 | 
| 3 | 12345 | abc | xyz | 321 | 
| 4 | 13400 | fff | aaa | 301 | 
-------------------------------------- 

Я пытался использовать некоторые из предложенных подходов в ответах здесь на переполнение стека, но не смог найти решение, которое работало для меня.

DELETE n1 FROM data n1, data n2 WHERE n1.id > n2.id AND n1.number = n2.number 

Не работает, так что я попробовал следующее:

DELETE FROM data where data.number in 
(
    SELECT number from data GROUP BY number HAVING COUNT(*)>1 
) 
LIMIT 1 

Не используется здесь либо, так что я застрял. Приветствуются всевозможные предложения.

РЕШЕНИЕ который работал на меня

Marc-B отмечен пост дубликат stackoverflow.com/a/3312066/1528290 попробовал этот подход, и он работал как шарм. мой запрос был:

alter ignore table data add unique i_number (number) 
+0

http://stackoverflow.com/questions/30401571/how-to-remove-duplicate-row-considering-the-arabic-phonetics/30402156#30402156 – Uueerdo

+0

@ B-Аббаси. Вы хотите удалить все вхождения повторяющихся строк? Или вы хотите сохранить одну строку для каждого набора повторяющихся строк? – DfrDkn

+0

Почему данные DELETE n1 FROM n1, данные n2 WHERE n1.id> n2.id AND n1.number = n2.number' не работают? Какая ошибка была дана? – johnjps111

ответ

0

Предполагая, что дублирование делается на number колонке. Попробуйте следующее:

DELETE FROM data 
WHERE data.number NOT IN (SELECT * 
        FROM (SELECT MAX(data.id) 
          FROM data n 
         GROUP BY data.number) x) 

Это будет содержать одну запись (которая имеет наибольшее число) и удалить остальные записи в таблице.

EDIT:

Я только что проверил с вашим запросом и он работал для меня:

DELETE n1 FROM foobarred n1, foobarred n2 
WHERE n1.id > n2.id AND n1.number = n2.number; 

SQLFIDDLE DEMO

Я думаю, вы должны следовать комментарий Дрю: на MySQL Workbench у вас есть для закрытия базы данных, перейдите в раздел «Редактировать/Настройки/Редактор SQL» и «@ снизу». «Безопасные обновления» снова подключится к серверу, выберите «db» и выпустите его поверх пасти

Marc-B отметил сообщение как дубликат stackoverflow.com/a/3312066/1528290, пробовал этот подход, и он работал как шарм. мой запрос был:

alter ignore table data add unique i_number (number) 
+0

O да, я полностью забыл написать об этом, я попробовал, и он удалил все записи из таблицы. Не знаю, почему. –

+0

Дублирующиеся строки являются точными репликами друг друга, кроме ID, который является основным ключом –

+0

@ B-Abbasi: - Обновлен мой ответ. Можете ли вы попробовать сейчас? –

Смежные вопросы