MYSQL. Удалить дубли строк?

Есть таблика с 100.000 строк.

Нужно удалить дубли строк(именно строк а не ячеек)

то есть чтобы от таблицы:

c1 c2

1 2

1 0

4 2

1 0

1 1

2 1


Осталось:

c1 c2

1 2

1 0

4 2

1 1

2 1


Одну строчку (1 0) нужно удалить так как из было 2.

Можно ли это сделать запросом или без php не обойтись?

Спасибо.
  • Вопрос задан
  • 56204 просмотра
Решения вопроса 2
bigbaraboom
@bigbaraboom
CREATE TEMPORARY TABLE tmp_tab AS SELECT DISTINCT * FROM your_table;

DELETE FROM your_table;

INSERT INTO your_table SELECT * FROM tmp_tab;

DROP TABLE tmp_tab;
Ответ написан
DevMan
@DevMan
CREATE TABLE `table_tmp` SELECT DISTINCT * FROM `table`;
DROP TABLE `table`;
RENAME TABLE `table_tmp` TO `table`;
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
mgyk
@mgyk
Можно еще ALTER IGNORE TABLE bzzz add unique index tmp(column1, column2)
Ответ написан
Dmi3yy
@Dmi3yy
Мне помог вот такой вариант:
ALTER IGNORE TABLE table1 ADD UNIQUE KEY(Name2, Name3);
Ответ написан
Комментировать
zoommy
@zoommy
Добавьте первичный ключ (id) а потом:

DELETE FROM table as me, table as clone WHERE me.c1 = clone.c1 AND me.c2 = clone.c2 AND me.id < clone.id

Проверено — работает, если я правильно понял задачу.
Ответ написан
@Ajex
Мне нравится такой способ:
Создаем таблицу dst с той же структурой, но добавляем цифровое поле DupCount

делаем запрос:
INSERT INTO dst SELECT * FROM src ON DUPLICATE KEY UPDATE dst.DupCount = dst.DupCount +1

DupCount для каждой строки будет содержать число встретившихся повторов.

Можно написать скрипт, который будет создавать таблицу dst, копировать таким образом туда данные, удалять исходную таблицу и переименовывать dst в src.
Ответ написан
Комментировать
bigbaraboom
@bigbaraboom
Могу сказать что DISCINCT это действительно ошибка всех баз данных и косится на него надо всегда, но в такой простой но не стандартной задачи это самый хороший вариант.
Ответ написан
Комментировать
pvasili
@pvasili
Создайте составной первичный (или просто уникальный) индекс на c1 и c2 поля.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы