Самый эффективный способ удаления повторяющихся записей из MySQL таблиц - PullRequest
0 голосов
/ 01 августа 2020

У нас есть таблица (назовем ее originalTbl), в которой есть повторяющиеся записи, которые мы хотим удалить. Под дублированием я подразумеваю, что все значения, кроме поля индекса AUTO INCREMENT , одинаковы. Один из способов сделать это - создать новую таблицу, подобную существующей (назовем ее uniqueTbl), а затем задать такой запрос:

INSERT INTO uniqueTbl (non-Index-field_1, non-Index-field_2, …, non-Index-field_n)
SELECT DISTINCT non-Index-field_1, non-Index-field_2, …, non-Index-field_n FROM originalTbl;

Позже мы отбросим originalTbl и переименуйте uniqueTbl в originalTbl.

Однако я ищу альтернативный подход, который удалит повторяющиеся записи из originalTbl напрямую, без дополнительных затрат на создание uniqueTbl и последующее его переименование в originalTbl.

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Если у вас мало дубликатов, ваш метод будет намного, намного быстрее. Если у вас их всего несколько (скажем, менее 1%), вы можете попробовать:

delete o
    from originalTbl o left join
         (select col1, col2, . . ., min(id) as min_id
          from originalTbl o
          group by col1, col2, . . .
         ) oo
         on oo.min_id = o.id
    where oo.min_id is null;
0 голосов
/ 01 августа 2020

Один вариант использует самостоятельное присоединение. Предполагая, что у вас есть три столбца, кроме id, это будет выглядеть так:

delete t
from mytable t
inner join (
    select col1, col2, col3, min(id) minid 
    from mytable
    group by col1, col2, col3
) t1
    on  t.col1 = t1.col1
    and t.col2 = t1.col2
    and t.col3 = t1.col3
    and t.id > t.minid

Это удаляет дубликаты, сохраняя строку с наименьшим id.

При этом , метод, который вы изначально показали, скорее всего, будет намного быстрее, чем этот. Накладные расходы, возникающие при переименовании таблицы, довольно малы.

...