Как удалить повторяющиеся строки и сохранить первый ряд? - PullRequest
9 голосов
/ 24 мая 2011

Я сделал ошибку, и у меня есть нежелательные дубликаты.

У меня есть таблица с 4 ключевыми полями.A1, k1, k2, k3.

A1 - автоинкремент и первичный ключ.

комбинация k1, k2 иk3 должен быть уникальным, и мне нужно удалить повторяющиеся строки перед созданием уникального индекса.В некоторых строках есть один дубликат, в других - много.

SELECT CONCAT(k1, k2, k) AS dup_value
  FROM myviews
 GROUP BY dup_value
HAVING (COUNT(dup_value) > 1)

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

Ответы [ 4 ]

15 голосов
/ 24 мая 2011

Сделайте резервную копию ваших данных, затем ...

MySQL поддерживает JOIN в операторах DELETE . Если вы хотите сохранить первый из дубликатов:

DELETE a
  FROM MYVIEWS a
  JOIN (SELECT MIN(t.a1) AS min_a1, t.k1, t.k2, t.k3
          FROM MYVIEWS t
      GROUP BY t.k1, t.k2, t.k3
        HAVING COUNT(*) > 1) b ON b.k1 = a.k1
                              AND b.k2 = a.k2
                              AND b.k3 = a.k3
                              AND b.min_a1 != a.a1

Если вы хотите сохранить последний из дубликатов:

DELETE a
  FROM MYVIEWS a
  JOIN (SELECT MAX(t.a1) AS max_a1, t.k1, t.k2, t.k3
          FROM MYVIEWS t
      GROUP BY t.k1, t.k2, t.k3
        HAVING COUNT(*) > 1) b ON b.k1 = a.k1
                              AND b.k2 = a.k2
                              AND b.k3 = a.k3
                              AND b.max_a1 != a.a1
2 голосов
/ 24 мая 2011

Как-то так?

DELETE FROM myviews WHERE EXISTS(SELECT CONCAT(k1, k2, k) AS dup_value
FROM myviews
GROUP BY dup_value
HAVING (COUNT(dup_value) > 1));
2 голосов
/ 24 мая 2011

Вы можете создать новую таблицу с той же структурой, но пустой, затем создать уникальный ключ для нее, затем сделать INSERT IGNORE / SELECT * FROM исходную таблицу в новой таблице, а затем удалить исходную таблицу.

INSERT IGNORE автоматически игнорирует любые первичные или уникальные проблемы с ключами и просто пропускает дубликаты.

0 голосов
/ 24 мая 2011

Вам нужен разделитель в вашей функции concat, потому что в противном случае "a", "b" и "cd" совпадают с "abcd", "", "".

...