Я хочу добавить индекс UNIQUE в таблицу, например:
ALTER TABLE 'mytable' ADD UNIQUE 'myunique_name'('first', 'second', 'third');
Mysql отвечает:
Duplicate entry '1-2-3' for key 'myunique_name'
Я точно знаю, что эта комбинация - всего одна тысяча, которая нарушает ограничение.
В этом специальном случае я точно знаю, что все строки, которые содержат одинаковые значения в трех указанных столбцах, также содержат одни и те же данные в других соответствующих полях (первичный индекс, разумеется, не имеет значения), поэтому все дубликаты могут быть удалена.
Есть ли способ удалить все повторяющиеся записи, но сохранить один (не имеет значения, какой первичный ключ хранится), чтобы можно было добавить уникальный индекс?
CREATE TEMPORARY TABLE IF NOT EXISTS MyTable engine=memory
select 1 as id, 1 col1,1 col2,1 col3
union all
select 2 as id, 2 col1,2 col2,2 col3
union all
select 3 as id, 3 col1,3 col2,3 col3
union all
select 4 as id, 4 col1,4 col2,4 col3
union all
select 5 as id, 1 col1,1 col2,1 col3
union all
select 6 as id, 2 col1,2 col2,2 col3
CREATE TEMPORARY TABLE IF NOT EXISTS MyDuplicateTableWithCount engine=memory
select col1 , col2 , col3, count(*) Count_1
from MyTable
group by col1 , col2 , col3
having count(*)>1
select a.* from MyTable a
inner join
(select col1 , col2 , col3
from MyDuplicateTableWithCount
) b
on a.col1 =b.col1 and a.col2 =b.col2 and a.col3 =b.col3
order by a.id
После получения дубликата id напишите свой запрос на удаление, указав дубликат id как
delete from myTable where id in (5,6)
Также используйте ниже запрос с использованием myTable сверху
CREATE TEMPORARY TABLE IF NOT EXISTS MyTable2 engine=memory
SELECT MIN(id) as id, Col1, Col2, Col3
FROM MyTable
GROUP BY Col1, Col2, Col3
DELETE a FROM MyTable as a
LEFT JOIN (
SELECT * from MyTable2
) as b ON
b.id = a.id
WHERE
b.id IS NULL