Удаление дубликатов определенного поля - PullRequest
2 голосов
/ 23 апреля 2011

У меня таблица выглядит следующим образом:

Field     | Type         | Null    | Key    | Default | Extra
----------+--------------+---------+--------+---------+----------------
index     | int(11)      | NO      | PRI    | NULL    | auto_increment
itemid    | int(11)      | NO      |        | NULL    |
name      | varchar(32)  | NO      |        | NULL    |
meta      | int(11)      | NO      |        | NULL    |

Таблица небольшая, и мне не нужно заботиться об оптимизации.

Некоторые записи имеют itemid, nameи meta дублируется, но я хочу удалить все те, у которых дублируется name, оставляя одну запись (которая больше не дублируется). Это MySQL.Я искал решение, но не нашел ничего, что смогло бы удовлетворить мои потребности.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2011

Поскольку данные небольшие, может быть проще создать таблицу с аналогичной структурой и выполнить такой запрос:

INSERT INTO new_table (index, itemid, name, meta)
SELECT index, itemid, name, meta FROM old_table GROUP BY name

После этого удалите old_table и переименуйте new_table.

Также решение, которое могло бы сработать (я не уверен), состоит в создании уникального индекса с IGNORE, например

ALTER IGNORE TABLE tblname
ADD UNIQUE INDEX ix_name (name)

IGNORE - это расширение MySQL для стандартного SQL.Он управляет работой ALTER TABLE, если в новой таблице присутствуют дубликаты уникальных ключей или появляются предупреждения при включенном строгом режиме.Если IGNORE не указан, копия прерывается и откатывается при возникновении ошибок дубликата ключа.Если указан IGNORE, только первая строка используется из строк с дубликатами на уникальном ключе. Другие конфликтующие строки удаляются.Неверные значения усекаются до ближайшего подходящего допустимого значения.

1 голос
/ 23 апреля 2011

Не уверен, что это то, что вы ищете, но вы можете попробовать предложение GROUP BY

SELECT index, itemid, name, meta FROM table GROUP BY name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...