Как удалить дубликаты в таблице MySQL? - PullRequest
149 голосов
/ 13 апреля 2010

Мне нужно DELETE дублировать строки для указанного sid в таблице MySQL.

Как я могу сделать это с помощью SQL-запроса?

DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"

Примерно так, но я не знаю, как это сделать.

Ответы [ 23 ]

4 голосов
/ 08 октября 2010

Эта процедура удалит все дубликаты (включая кратные) в таблице, сохранив последний дубликат. Это расширение Получение последней записи в каждой группе

Надеюсь, это кому-нибудь пригодится.

DROP TABLE IF EXISTS UniqueIDs;
CREATE Temporary table UniqueIDs (id Int(11));

INSERT INTO UniqueIDs
    (SELECT T1.ID FROM Table T1 LEFT JOIN Table T2 ON
    (T1.Field1 = T2.Field1 AND T1.Field2 = T2.Field2 #Comparison Fields 
    AND T1.ID < T2.ID)
    WHERE T2.ID IS NULL);

DELETE FROM Table WHERE id NOT IN (SELECT ID FROM UniqueIDs);
3 голосов
/ 07 сентября 2017

Еще один простой способ ... с помощью UPDATE IGNORE:

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

Добавить временный справочный столбец, чтобы отметить уникальные символы:

ALTER TABLE `yourtable` ADD `unique` VARCHAR(3) NOT NULL AFTER `lastcolname`;

=> это добавит столбец к вашей таблице.

Обновите таблицу, попробуйте пометить все как уникальные, но игнорируйте возможные ошибки из-за дублирования ключа (записи будут пропущены):

UPDATE IGNORE `yourtable` SET `unique` = 'Yes' WHERE 1;

=> вы обнаружите, что ваши дубликаты записей не будут помечены как уникальные = 'Да', другими словами, только один из каждого набора дубликатов записей будет отмечен как уникальный.

Удалить все, что не уникально:

DELETE * FROM `yourtable` WHERE `unique` <> 'Yes';

=> Это удалит все повторяющиеся записи.

Брось колонку ...

ALTER TABLE `yourtable` DROP `unique`;
2 голосов
/ 16 апреля 2018

Я считаю решение Вернера выше наиболее удобным, поскольку оно работает независимо от наличия первичного ключа, не связывается с таблицами, использует простой sql, ориентированный на будущее, очень понятно.

Как я уже говорил в своем комментарии, это решение не было должным образом объяснено. Так что это мое, основываясь на этом.

1) добавить новый логический столбец

alter table mytable add tokeep boolean;

2) добавить ограничение на дублированные столбцы И новый столбец

alter table mytable add constraint preventdupe unique (mycol1, mycol2, tokeep);

3) установить для логического столбца значение true. Это будет выполнено только в одной из дублированных строк из-за нового ограничения

update ignore mytable set tokeep = true;

4) удалить строки, которые не были помечены как tokeep

delete from mytable where tokeep is null;

5) опустить добавленный столбец

alter table mytable drop tokeep;

Я предлагаю вам сохранить добавленное вами ограничение, чтобы в будущем исключались новые дубликаты.

1 голос
/ 20 ноября 2017

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

Али , в вашем случае вы можете запустить что-то вроде этого:

-- create a new temporary table
CREATE TABLE tmp_table1 LIKE table1;

-- add a unique constraint    
ALTER TABLE tmp_table1 ADD UNIQUE(sid, title);

-- scan over the table to insert entries
INSERT IGNORE INTO tmp_table1 SELECT * FROM table1 ORDER BY sid;

-- rename tables
RENAME TABLE table1 TO backup_table1, tmp_table1 TO table1;
0 голосов
/ 05 февраля 2019
DELETE T2
FROM   table_name T1
JOIN   same_table_name T2 ON (T1.title = T2.title AND T1.ID <> T2.ID)
0 голосов
/ 23 мая 2018

Я думаю, что это сработает, в основном скопировав таблицу и очистив ее, затем поместив в нее только отдельные значения, но, пожалуйста, дважды проверьте ее, прежде чем делать это для больших объемов данных.

Создает точную копию вашего стола

создать таблицу temp_table как oldtablename; вставить temp_table select * from oldtablename;

Опорожняет ваш оригинальный стол

УДАЛИТЬ * от oldtablename;

Копирует все отдельные значения из скопированной таблицы обратно в исходную таблицу

ВСТАВИТЬ oldtablename SELECT * из группы temp_table по имени, фамилии, dob

Удаляет вашу временную таблицу.

Drop Table temp_table

Вам нужно сгруппировать по всем полям, которые вы хотите сохранить различимыми.

0 голосов
/ 29 мая 2017

Существует всего несколько основных шагов при удалении дубликатов данных из вашей таблицы:

  • Сделай резервную копию своего стола!
  • Найти повторяющиеся строки
  • Удалить повторяющиеся строки

Вот полный учебник: https://blog.teamsql.io/deleting-duplicate-data-3541485b3473

0 голосов
/ 25 мая 2017

Это сделает столбец column_name первичным ключом, а тем временем проигнорирует все ошибки. Таким образом, будут удалены строки с повторяющимся значением для column_name.

ALTER IGNORE TABLE `table_name` ADD PRIMARY KEY (`column_name`);
0 голосов
/ 27 октября 2015
delete from `table` where `table`.`SID` in 
    (
    select t.SID from table t join table t1 on t.title = t1.title  where t.SID > t1.SID
)
0 голосов
/ 27 марта 2017

Это работает для больших таблиц:

 CREATE Temporary table duplicates AS select max(id) as id, url from links group by url having count(*) > 1;

 DELETE l from links l inner join duplicates ld on ld.id = l.id WHERE ld.id IS NOT NULL;

Удалить самое старое изменение max(id) на min(id)

...