Как я могу удалить дубликаты (смесь двух строк) строк в SQL? - PullRequest
0 голосов
/ 12 марта 2019

У меня есть такая таблица:

id   c1   c2
1    5    abc
2    5    abc
3    2    xyz
4    2    xyz
5    68   sdf

Я хочу удалить строки, в которых c1 и c2 одинаковы (то есть строки с id 2 и 4)

Редактировать: я пытался

ALTER IGNORE TABLE jobs
ADD UNIQUE INDEX idx_name (c1, c2);

но получил это

1834 - Невозможно удалить строки из таблицы, которая является родительской в ​​ограничении внешнего ключа 'xyz' таблицы 'abc'

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Этого можно достичь за три шага.

  1. Вставка уникальных записей в таблицу tmp (та же структура таблицы, что и у 'jobs').

INSERT INTO tmp (`c1`, `c2`) 
    SELECT c1, c2 
    FROM jobs 
    GROUP BY c1, c2
Удалить или переименовать таблицу 'job'

DROP TABLE job

ALTER TABLE job
RENAME job_archived
Переименуйте таблицу 'tmp' в 'job'
ALTER TABLE tmp
RENAME job

Вот как я выполняю такую ​​задачу.Там может быть лучший способ сделать то же самое ... Ура!

0 голосов
/ 12 марта 2019

Полагаю, имя таблицы - foobar, а c1 и c2 не обнуляются.

этот запрос выберет дубликат

select d.* from ( select c1 ,c2 , count(*) as cnt , min(id) as mid from foobar         group by c1,c1 ) as e 
       join foobar d on d.c1=e.c1 and d.c2=e.c2 and d.id > e.mid ;

Вы должны создать временную таблицу со списком всех идентификаторов, которые хотите удалить.

create table bad_id_foobar as select d.id  from ( select c1 ,c2 , count(*) as cnt , min(id) as mid from foobar         group by c1,c1 ) as e 
       join foobar d on d.c1=e.c1 and d.c2=e.c2 and d.id > e.mid ; 

этот запрос удалит дубликат

 delete from foobar           where id in ( select b.id from  bad_id_foobar b );  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...