2010-01-20 50 views
4

這是我嘗試在查詢刪除行所以我有一個最大行限制

DELETE FROM table ORDER BY dateRegistered DESC LIMIT 1000 * 

我想在我已經設計了一個腳本來運行這樣的查詢做解釋了。每次發現第1001條記錄或更高的舊記錄時,刪除

因此,您可以設置最大行大小,但刪除所有較舊的記錄。

實際上有沒有辦法在CREATE語句中設置它。

因此:如果我在數據庫中有9023行,當我運行該查詢應該刪除8023行,讓我用1000

回答

3

立即發生,我唯一的辦法這個確切的工作是手動做。

首先,鎖定桌子。當你這樣做時,你不希望行數改變。 (如果鎖不適合你的應用程序實用,你必須制定出一個更聰明的排隊系統,而不是使用此方法。)

接下來,獲取當前行數:

SELECT count(*) FROM table 

一旦你有這個,你應該用簡單的數學能夠找出需要刪除的行數。假設它說1005 - 你需要刪除5行。

DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5 

現在,解鎖表格。


如果鎖不適合您的方案實用,你就必須更聰明一點 - 例如,選擇所有需要刪除的行的唯一ID,並預約了漸進刪除。我會讓你自己工作:)

+0

是的,但是如果你知道我的意思,那將會刪除1000行......並且不會留下1000行。讓我試着編輯這些問題 – 2010-01-20 20:19:09

+0

啊,我明白了。嗯... – Matchu 2010-01-20 20:20:32

+0

是的,你是正確的ASC ...我的大腦無法正常工作 – 2010-01-20 20:21:00

4

如果你有一個唯一的行ID這裏是理論上正確的方法,但它不是非常有效(即使你有一個索引在dateRegistered列):

DELETE FROM table 
WHERE id NOT IN (
    SELECT id FROM table 
    ORDER BY dateRegistered DESC 
    LIMIT 1000 
) 

我認爲你會按照日期,而不是行數,直接限制了DELETE更好。

我不認爲有一種方法可以在CREATE TABLE聲明中進行設置,至少不是便攜式聲明。

+0

哦,我喜歡這個。我傾向於偏離子查詢,因爲它們通常效率低下,但乍看起來似乎更加高效,尤其是因爲它不必爲每行重新運行。 – Matchu 2010-01-20 20:32:36