2011-01-27 102 views
2

我有一個包含可版本化鍵/值對的mysql表。它具有列:清理數據庫記錄

標識(INT,自動增量,主鍵)重點(VARCHAR)(文本)版本(INT)

對於一個給定鍵的值更新,版本號會增加,並添加新行,而不是更改現有條目。現在,這個系統經歷了一個繁重的編輯階段,並且有很多舊版本對我來說毫無用處。

我還沒有嘗試構建一個SQL腳本,它將除去表中每個鍵的最高版本以外的所有內容。 我非常感謝任何人的幫助。

回答

1

做出了一個充滿希望的安全假設,即最高版本也具有最高的ID。

delete from table 
where id not in 
    (select max(id) 
    from table 
    group by key) 
0

測試此選擇腳本時,應選擇所有行的舊版本。

SELECT * FROM table o where id in (SELECT i.* FROM table i WHERE i.Version<>MAX(i.Version) and i.ID=o.ID) 

如果有效,那麼這只是用「刪除」替換「SELECT *」的問題。請確保在刪除任何內容之前備份表格。

http://www.cyberdesignworks.com.au/news-blog/web-developers-MySQL-Quick-Tips (參見通過SQL複製表)

我的腳本不進行關於最高的ID是最高版本的假設。

0
delete * from yourtable where id not in (select id from yourtable x where version=(select max(version) from yourtable where id=x.id)) 

不舒服,但應該工作! :)

嘗試先用選擇這樣的:

select * from yourtable where id not in (select id from yourtable x where version=(select max(version) from yourtable where id=x.id)) limit 500