2011-11-08 93 views
12

我需要設置我的MySQL表中的最大行數限制。文件告訴我們,我們可以使用下面的SQL代碼來創建表:如何在MySQL表中設置最大行數?

CREATE TABLE `table_with_limit` 
    `id` int(11) DEFAULT NULL 
) ENGINE=InnoDB MAX_ROWS=100000 

MAX_ROWS屬性不是一個硬性限制(「商店不是100多個000行和刪除其他」),但對於數據庫引擎一個暗示,此表格將至少有100 000行。

唯一可能的途徑我看到了解決問題的方法是使用BEFORE INSERT觸發器,它會檢查的行數表和刪除舊行。但我敢肯定,這是一個巨大的過熱:/

另一種解決方案是清除表的cron腳本每N分鐘。這是最簡單的方法,但仍然需要另一個系統來監視。

任何人都知道一個更好的解決方案? :)

回答

11

儘量使上增加一個新的記錄表的限制。在添加新記錄時引發錯誤。

DELIMITER $$ 

CREATE TRIGGER trigger1 
BEFORE INSERT 
ON table1 
FOR EACH ROW 
BEGIN 
    SELECT COUNT(*) INTO @cnt FROM table1; 
    IF @cnt >= 25 THEN 
    CALL sth(); -- raise an error 
    END IF; 
END 
$$ 

DELIMITER ; 

請注意,COUNT操作在大型InnoDb表上可能會很慢。

在MySQL 5.5,你可以使用SIGNAL語句引發錯誤。

+0

我會將您的答案標記爲正確,因爲它是最有趣的答案。謝謝! – WASD42

3

有沒有辦法來限制錶行的最大數量在MySQL,除非你寫一個觸發器來做到這一點。

5
  • 10萬行創建一個表。
  • 預填充在過去 「時間戳」的領域之一。
  • 選擇最早的記錄,更新「時間戳」 當「創造」(更新)記錄。
  • 只能使用select和update - 不要使用insert或delete。
  • 的「時間戳」字段反向指標,使 選擇/更新快。
+1

這看起來像WAY更多的工作比插入和截斷表時達到蓋。 – Jakub

+0

這是合乎邏輯的。謝謝喬。 –

+0

哇,這是如此的原創,謝謝! – Daniel

0

我只是做了我的頭頂部的答案。我的假設是,你需要一些東西,比如放入記錄的「桶」,並且你希望在它達到特定的記錄數量之前清空它。

insert語句後,運行SELECT LAST_INSERT_ID();這將讓你記錄id的自動遞增。是的,你仍然需要運行額外的查詢,但是資源密集度很低。一旦達到一定數量,截斷表重置自動增量編號

否則你不能在mysql中有一個'capped'表,因爲你必須有預定義的動作,比如(我們不允許記錄,我們是否截斷表格等等)。

+0

截斷刪除表中的所有行,不將其連接到N行:/ – WASD42

+0

正確...我誤解了嗎?我認爲當限制被打時,你想「清空」桌子?沒有? – Jakub

+0

不,我需要從表格中刪除過時的(較舊的)行,而不是所有的行:) – WASD42