Удалить дубликаты записей в таблице MySQL с ключом, но не первичным ключом - PullRequest
0 голосов
/ 18 августа 2011

Мне нужно удалить дубликаты записей (только для сохранения одной копии) из таблицы MySQL в формате MyISAM.Я прочитал много вопросов в Stackoverflow о похожих проблемах, но всегда люди используют поле идентификатора в качестве уникального идентификатора или аналогичного, и у меня нет этого поля, потому что мой «Ключ» может быть продублирован.Я хочу удалить строки с дубликатами 'Fecha' и 'Equip'.

CREATE TABLE `pfc` (
`Fecha` datetime NOT NULL,
`Equip` int(10) unsigned NOT NULL,
`Value` double NOT NULL,
KEY `Fecha` (`Fecha`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=21 ROW_FORMAT=FIXED;

Пример данных таблицы:

Fecha              | Equip | Value 
06/02/2011 0:00:11 |  22   |  29.0
06/02/2011 0:22:11 |  22   |  45.3
06/02/2011 0:00:11 |  22   |  29.0

Результат должен быть:

Fecha              | Equip | Value 
06/02/2011 0:00:11 |  22   |  29.0
06/02/2011 0:22:11 |  22   |  45.3

Эта структура не может быть изменена.Я не могу использовать решения PRIMARY KEY или UNIQUE INDEX.Создание временной таблицы без дубликатов с последующим переименованием также будет плохим решением, поскольку ключ и другие параметры будут потеряны.

Спасибо

Ответы [ 3 ]

9 голосов
/ 18 августа 2011
ALTER IGNORE TABLE `pfc` ADD UNIQUE(`Fetcha`, `Equip`);

Это сохранит первую найденную запись и удалит дубликаты из таблицы.

Из руководства MySQL:

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

Edit:

Чтобы создать точную копию вашей таблицы, используйте следующее:

CREATE TABLE table_copy SELECT * FROM pfc;

Это скопирует структуру таблицы и данные. После этого выполните команду ALTER, чтобы добавить ограничение UNIQUE и отфильтровать дублирующиеся записи.

0 голосов
/ 22 октября 2013
DELETE n1 FROM pfc n1, pfc n2 WHERE n1.Fecha = n2.Fecha AND n1.Equip=n2.Equip AND n1.Value=n2.Value
0 голосов
/ 18 августа 2011

Просто в качестве теста, попробуйте это, чтобы увидеть, если это то, что вы хотите

CREATE TABLE new_pfc AS
SELECT * FROM pfc GROUP BY fecha, equip
...