2011-01-12 8 views
1

カードゲームでプレイヤーが最後に受け取った手を持つSQLテーブルがあります。プレイヤーは常にプレーしていると、データが重要ではありません(ただギミックがプレーヤーのプロフィールページに表示される)とIのようテーブルに一定数のレコードを残す

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

:手が整数(32ビット== 32枚のカード)で表されます私のデータベースがあまりにも急速に成長しないようにするために、私はプレーヤーIDごとに最大10のレコードしか保持しません。

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; 

を残念ながら、これはで失敗します:だから私はこのにPL/pgSQLプロシージャを宣言しようとしている削除はオフセットをサポートしていないため

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

ありがとうございますが、中に使用しているとき、私はいつも心配です(もしあれば)この1が正しくstamp上の重複を処理します - リスト - 彼らはあまりにも高価なパフォーマンス賢明ではありませんか? –

+0

必ずしもそうではありません。特に10行に制限されている場合は特にそうです。しかし、実行計画だけが伝えることができます... –

+0

ありがとうございました(と私は上記の "desc"を追加しなければならなかった) –

0

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 
     ); 
+0

重複についての良い点。私の仮定は、重複があった場合、おそらくそれらも削除されるべきであったということでした。しかし、アレクサンダーだけが言うことができます –

関連する問題