我需要从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和另一个参数将丢失。
由于
答案 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