2011-01-12 96 views
1

我有一張SQL表格,它持有玩家在紙牌遊戲中接收到的最後一手牌。手是由整數表示(32位== 32卡):在表格中保留一定數量的記錄

create table pref_hand (
     id varchar(32) references pref_users, 
     hand integer not NULL check (hand > 0), 
     stamp timestamp default current_timestamp 
); 

當玩家在玩不斷,並且該數據並不重要(在玩家的個人資料頁面中顯示只是一個噱頭)和我不希望我的數據庫增長得太快,我想每個玩家ID只保留10條記錄。所以,我想聲明這個PL/pgSQL的過程:

create or replace function pref_update_game(_id varchar, 
    _hand integer) returns void as $BODY$ 
     begin 

     delete from pref_hand offset 10 where id=_id order by stamp; 
     insert into pref_hand (id, hand) values (_id, _hand); 

     end; 
$BODY$ language plpgsql; 

可惜這次失敗:

ERROR: syntax error at or near "offset" 

因爲刪除不支持偏移。有人請在這裏有一個更好的主意嗎?

回答

1

像這樣的東西(未測試!)

 
DELETE FROM pref_hand 
WHERE id = _id 
    AND stamp in (SELECT h2.stamp 
       FROM pref_hand h2 
       WHERE h2.id = _id 
       ORDER BY stamp DESC 
       OFFSET 10); 
+0

謝謝你,但是使用的時候,我總是擔心 - 列表 - 它們不是太昂貴的性能方面? – 2011-01-12 12:37:04

+0

不一定,特別是如果它限制爲10行。但只有執行計劃可以告訴... – 2011-01-12 12:39:17

0

這人會正確處理stamp重複的(如果有的話)

INSERT 
INTO pref_hand (id, hand) 
VALUES (_id, _hand); 

DELETE 
FROM pref_hand 
WHERE ctid IN 
     (
     SELECT ctid 
     FROM pref_hand 
     WHERE id = _id 
     ORDER BY 
       stamp 
     OFFSET 10 
     ); 
相關問題