MySql: удалить строки таблицы в зависимости от повторяющихся значений столбцов? - PullRequest
7 голосов
/ 05 октября 2010

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

Итак, как я могу удалить те строки, которые имеют одинаковое значение года?

Спасибо

Ответы [ 3 ]

8 голосов
/ 05 октября 2010

Я думаю, вы можете просто попробовать добавить УНИКАЛЬНЫЙ ИНДЕКС, используя IGNORE:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`column`);

MySQL должен ответить примерно так:

Query OK, 4524 rows affected (1.09 sec)
Records: 4524 Duplicates: 9342 Warnings: 0

Конечно, вы оставите этов MySQL, чтобы решить, какие строки отбрасывать.

РЕДАКТИРОВАТЬ:

это работает для любого количества столбцов:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`);

проверьте документацию MySQL по CREATEINDEX .Обычная ошибка (по крайней мере, одна, с которой я столкнулся один раз) - забывать, что NULL = NULL не соответствует действительности (но NULL), поэтому {42, NULL} и {42, NULL} разрешены для уникального индекса на двухколонны.

3 голосов
/ 03 марта 2015

Принятый ответ работает отлично, но IGNORE ключевое слово id устарело сейчас ( Источник ), оно не будет работать после MySQL 5.6 (может быть).

Хотя опция alter table очень простая и прямая, НО, теперь единственной возможностью является создание новой таблицы с помощью запроса, подобного следующему:

CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3;

После этого вы можете удалить <your_table> и переименовать <table_name> в свойтаблица.

Здесь вы можете изменить список столбцов в предложении Group By в соответствии с вашими потребностями (от всех столбцов до одного столбца или нескольких столбцов, которые имеют повторяющиеся значения вместе).

Здесь я также хочу упомянуть точку:

  1. уникальный индекс не вносит изменений в строку, если какие-либо столбцы (из индекса, как здесь 3 столбца) имеют null в качестве значения.Например: null,1,"asdsa" может быть сохранено дважды
  2. таким же образом, если у вас есть один столбец в уникальном индексе, тогда несколько строк со значениями null (для этого столбца) останутся в таблице
  3. Плюсточка с create table есть, она также будет работать с нулевыми значениями.
0 голосов
/ 01 сентября 2017

«GROUP BY» не работает, если какие-либо выбранные столбцы не зависят от столбцов «group by». Смотрите "ONLY_FULL_GROUP_BY" sql_mode. Вы можете изменить sql_mode, но я не смог сделать это с помощью knex (мой ORM). Я закончил тем, что сделал фильтрацию возвращенных результатов sql в коде.

...