Mysql: Как удалить все дубликаты, которые нарушают ограничение UNIQUE

0

Я хочу добавить индекс UNIQUE в таблицу, например:

ALTER TABLE 'mytable' ADD UNIQUE 'myunique_name'('first', 'second', 'third');

Mysql отвечает:

Duplicate entry '1-2-3' for key 'myunique_name'

Я точно знаю, что эта комбинация - всего одна тысяча, которая нарушает ограничение.

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

Есть ли способ удалить все повторяющиеся записи, но сохранить один (не имеет значения, какой первичный ключ хранится), чтобы можно было добавить уникальный индекс?

  • 0
    Не могли бы вы прислать схему вашей таблицы с некоторыми тестовыми данными, чтобы уточнить ваш вопрос.
  • 0
    Возможный дубликат Как удалить дубликаты записей MySQL
Показать ещё 1 комментарий
Теги:

1 ответ

0
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню