使用密钥但不是主键删除MySQL表中的重复记录

Jai*_* M. 0 mysql duplicate-removal

我需要从MyISAM格式的MySQL表中删除重复记录(只是为了保留一个副本).我在Stackoverflow中已经阅读了很多关于类似问题的问题,但是人们总是使用ID字段作为唯一ID或者类似的,我没有这个字段,因为我的"密钥"可能是重复的.我想删除'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;
Run Code Online (Sandbox Code Playgroud)

示例表数据:

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
Run Code Online (Sandbox Code Playgroud)

结果应该是:

Fecha              | Equip | Value 
06/02/2011 0:00:11 |  22   |  29.0
06/02/2011 0:22:11 |  22   |  45.3
Run Code Online (Sandbox Code Playgroud)

这种结构不可能改变.我不能使用PRIMARY KEY或UNIQUE INDEX解决方案.要创建一个没有重复项的时态表,然后重命名也将是一个糟糕的解决方案,因为KEY和另一个参数将丢失.

谢谢

N.B*_*.B. 9

ALTER IGNORE TABLE `pfc` ADD UNIQUE(`Fetcha`, `Equip`);
Run Code Online (Sandbox Code Playgroud)

这将保留它找到的第一条记录并从表中删除重复项.

来自MySQL手册:

IGNORE是标准SQL的MySQL扩展.如果新表中的唯一键上存在重复项,或者启用了严格模式时出现警告,它将控制ALTER TABLE的工作方式.如果未指定IGNORE,则复制将中止并在发生重复键错误时回滚.如果指定了IGNORE,则只使用第一行在唯一键上具有重复项的行.其他冲突的行将被删除.不正确的值将截断为最接近的匹配可接受值.

编辑:

要创建表的精确副本,请使用以下命令:

CREATE TABLE table_copy SELECT * FROM pfc;

这将复制表结构和数据.之后,运行ALTER命令以添加UNIQUE约束并过滤掉重复的记录.