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

时间:2011-08-18 11:35:57

标签: 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;

示例表数据:

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解决方案。要创建一个没有重复项的时态表,然后重命名也将是一个糟糕的解决方案,因为KEY和另一个参数将丢失。

由于

3 个答案:

答案 0 :(得分:9)

ALTER IGNORE TABLE `pfc` ADD UNIQUE(`Fetcha`, `Equip`);

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

来自MySQL手册:

  

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

编辑:

要创建表格的精确副本,请使用以下内容:

CREATE TABLE table_copy SELECT * FROM pfc;

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

答案 1 :(得分:0)

正如测试一样,试试看它是否是你想要的

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

答案 2 :(得分:0)

DELETE n1 FROM pfc n1, pfc n2 WHERE n1.Fecha = n2.Fecha AND n1.Equip=n2.Equip AND n1.Value=n2.Value