2010-08-24 34 views

回答

3

有幾種可能的方法,一種是使用存儲過程插入記錄。這樣,SP會檢查是否有超過20個,並在插入新的之後刪除舊的。缺點是如果你手動插入一行,它不會被丟棄。

一個trigger可能工作...創建AFTER INSERT觸發器,然後刪除舊的登錄> 20 ...

2

不,這是不可能的。

有兩種方式:

  • 定期從表中刪除行,讓20行仍然存在。
  • 當插入一行並且有超過20行時,更新現有行而不是插入它。
1

我不相信你可以指定只能存儲一定數量的記錄,但是你可以控制插入新記錄的行爲。 MySQL爲您提供了一些非標準工具,可以幫助您在不使用sprocs或觸發器的情況下實現此功能。看到這個鏈接:http://www.xaprb.com/blog/2007/01/11/how-to-implement-a-queue-in-sql/

在那篇文章中的描述是非常詳盡的,我不會在這裏重複很多。總而言之,您使用MySQL的REPLACE命令而不是INSERT,或者使用ON DUPLICATE KEY UPDATE語句作爲INSERT查詢的一部分。將它與一個帶有兩個唯一鍵的表結合在一起...

此表有兩個唯一鍵:一個用作單調增加的「行號」,另一個用於使換行效果起作用。唯一真實的數據是水果專欄。這裏有一個查詢中插入「蘋果」到隊列:

insert into q(id, modulo, fruit) 
select 
    (coalesce(max(id), -1) + 1), 
    (coalesce(max(id), -1) + 1) mod 5, 
    'apples' 
from q 
    on duplicate key update 
    id = values(id), 
    fruit = values(fruit) 

這裏的查詢做什麼:它發現在表ID的最大值,這應該因爲它的索引是有效的。如果沒有行,則結果將爲NULL,其中COALESCE()將轉換爲-1。然後它爲該值添加一個值,該值將成爲id序列中下一個最大的值。我在這裏真正做的是滾動我自己的AUTO_INCREMENT,稍微扭曲一下:序列從零開始,而不是一個。

等請參閱(許多)更多細節的鏈接。 :)

請注意,對於您的情況(因爲您想維護20個記錄每個用戶),您需要通過UserID添加適當的過濾邏輯。如果你一次只爲一個用戶插入一行,這應該是非常簡單的...