2011-08-18 36 views
0

我需要從MyISAM格式的MySQL表中刪除重複記錄(僅保留一個副本)。我已經閱讀了許多有關類似問題的Stackoverflow的問題,但總是人們使用一個ID字段作爲唯一的ID或類似的,我沒有這個字段,因爲我的「鑰匙」可以重複。我想刪除'Fecha'和'Equip'重複的行。使用密鑰刪除MySQL表中的重複記錄但不使用主鍵

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和其他參數會丟失。

感謝

+1

爲什麼臨時表是一個不好的解決方案?你總是可以重新創建索引。另外,如果Equip和Fecha是重複的,如果值不同,應該選擇什麼值? – Jacob

+0

臨時表可以工作,但不能創建表「new_fc」作爲「Octopus-Paul」,然後將「new_pfc」重命名爲「pfc」。我如何使用節奏表來解決這個問題? –

+0

您不必使用臨時表格,問題就有更優雅的解決方案。 –

回答

0

就像一個測試,試試這個,看看它是否是你想要

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

正如我所說,創建一個臨時的「new_pfc」是一個糟糕的解決方案,因爲索引和其他格式都丟失了。我需要避免更改表格格式。 –

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

這將保持它找到的第一個記錄,並從表中刪除重複的東西。

從MySQL手冊:

IGNORE是MySQL擴展到標準SQL。它控制如果ALTER TABLE在新表中的唯一鍵上有重複項,或者如果在嚴格模式啓用時發生警告,則會如何工作。如果指定IGNORE不是 ,則複製將被中止並回滾,如果出現重複鍵錯誤 。如果指定IGNORE,則只有第一行用於具有 重複的唯一鍵上的行。其他衝突的行被刪除。 不正確的值被截斷爲最接近匹配的可接受的 值。

編輯:

創建表的精確副本,使用以下命令:

CREATE TABLE table_copy SELECT * FROM pfc;

這將複製表結構和數據。之後,運行ALTER命令添加UNIQUE約束並過濾出重複的記錄。

+0

對不起,正如我所說的,我不能使用UNIQUE,因爲格式表是不可觸摸的。 –

+0

因此,創建表的副本,添加約束,篩選結果,截斷原始表並使用複製表的內容填充它。這大概是2分鐘的工作。你可以截斷或刪除,對吧? –

+0

如果格式爲_identical_,我將創建表的副本,但我不知道如何執行此操作。 –

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