У меня есть таблица с некоторыми идентификаторами + заголовки. Я хочу сделать столбец заголовка уникальным, но он уже имеет по записям 600k, некоторые из которых являются дубликатами (иногда несколько дюжин раз законченный).
Как я удаляю все дубликаты, кроме одного, таким образом, я могу добавить УНИКАЛЬНЫЙ КЛЮЧ к столбцу заголовка после?
Эта команда добавляет уникальный ключ и удаляет все строки, которые генерируют ошибки (из-за уникального ключа). Это удаляет дубликаты.
ALTER IGNORE TABLE table ADD UNIQUE KEY idx1(title);
Изменить: Обратите внимание, что эта команда может не работать для таблиц InnoDB для некоторых версий MySQL. См. этот пост для обходного пути. (Благодарю "анонимного пользователя" за эту информацию.)
Создайте новую таблицу, содержащую только отдельные строки исходной таблицы. Возможно, есть и другие способы, но я считаю этот наиболее чистым.
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;
Здесь показано, как это сделать в 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