2011-01-12 9 views
1

Ich habe eine SQL-Tabelle, die die letzten Hände hält, die ein Spieler im Kartenspiel erhalten hat. Die Hand wird durch eine ganze Zahl (32 Bit == 32 Karten) dargestellt:Behalte eine bestimmte Anzahl von Datensätzen in einer Tabelle

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

Da die Spieler spielen ständig und dass Daten nicht wichtig ist (nur ein Gimmick bei Spieler-Profilseite angezeigt werden) und I Ich möchte nicht, dass meine Datenbank zu schnell wächst, ich möchte nur bis zu 10 Datensätze pro Spieler-ID behalten. So versuche ich, dieses PL/PgSQL Prozedur zu deklarieren:

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; 

aber leider nicht mit:

ERROR: syntax error at or near "offset" 

weil löschen nicht versetzt unterstützen. Hat jemand bitte eine bessere Idee hier?

Antwort

1

Etwas Ähnliches (nicht getestet!)

 
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

Danke handhaben, aber ich bin immer besorgt, wenn Sie sich mit der -Listen - sind sie nicht zu teuer in Bezug auf die Leistung? –

+0

Nicht unbedingt, besonders wenn es auf 10 Zeilen beschränkt ist. Aber nur der Ausführungsplan kann sagen ... –

+0

Danke (und ich musste "desc" oben hinzufügen) –

0

Dieser wird die Duplikate auf stamp richtig (falls vorhanden)

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

Guter Punkt über die Duplikate. Meine Annahme war, dass * wenn * es Duplikate wären, höchstwahrscheinlich auch sie gelöscht werden sollten. Aber nur Alexander kann es erzählen –

Verwandte Themen