Как удалить дублирующиеся записи из mysql дб?

У меня есть таблица с некоторыми идентификаторами + заголовки. Я хочу сделать столбец заголовка уникальным, но он уже имеет по записям 600k, некоторые из которых являются дубликатами (иногда несколько дюжин раз законченный).

Как я удаляю все дубликаты, кроме одного, таким образом, я могу добавить УНИКАЛЬНЫЙ КЛЮЧ к столбцу заголовка после?

37
задан abatishchev 16 July 2010 в 07:53
поделиться

3 ответа

Эта команда добавляет уникальный ключ и удаляет все строки, которые генерируют ошибки (из-за уникального ключа). Это удаляет дубликаты.

ALTER IGNORE TABLE table ADD UNIQUE KEY idx1(title); 

Изменить: Обратите внимание, что эта команда может не работать для таблиц InnoDB для некоторых версий MySQL. См. этот пост для обходного пути. (Благодарю "анонимного пользователя" за эту информацию.)

79
ответ дан 27 November 2019 в 04:22
поделиться

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

CREATE TABLE tmp_table AS SELECT DISTINCT [....] FROM main_table

More specifically:
Более быстрый способ - это вставка отдельных строк во временную таблицу. Используя delete, я потратил несколько часов на удаление дубликатов из таблицы в 8 миллионов строк. С помощью insert и distinct это заняло всего 13 минут.

CREATE TABLE tempTableName LIKE tableName;  
CREATE INDEX ix_all_id ON tableName(cellId,attributeId,entityRowId,value);  
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) SELECT DISTINCT cellId,attributeId,entityRowId,value FROM tableName;  
DROP TABLE tableName;  
INSERT tableName SELECT * FROM tempTableName;  
DROP TABLE tempTableName;  
10
ответ дан 27 November 2019 в 04:22
поделиться

Здесь показано, как это сделать в SQL2000. Я не совсем знаком с синтаксисом MySQL, но уверен, что здесь есть что-то сопоставимое

create table #titles (iid int identity (1, 1), title varchar(200))

-- Repeat this step many times to create duplicates
insert into #titles(title) values ('bob')
insert into #titles(title) values ('bob1')
insert into #titles(title) values ('bob2')
insert into #titles(title) values ('bob3')
insert into #titles(title) values ('bob4')


DELETE T  FROM 
#titles T left join 
(
  select title, min(iid) as minid from #titles group by title
) D on T.title = D.title and T.iid = D.minid
WHERE D.minid is null

Select * FROM #titles
0
ответ дан 27 November 2019 в 04:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: