Хранить определенное количество записей в таблице - PullRequest
2 голосов
/ 12 января 2011

У меня есть 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
);

Поскольку игроки играют постоянно, и эти данные не важны (просто уловка, отображаемая на страницах профиля игрока), и я не хочу, чтобы моя база данных росла слишком быстро, я хотел бы сохранить только 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"

потому что delete не поддерживает смещение. Кто-нибудь, пожалуйста, есть идея получше?

Ответы [ 2 ]

1 голос
/ 12 января 2011

Как то так (не проверено!)

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 голосов
/ 12 января 2011

Этот будет правильно обрабатывать дубликаты на 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
        );
...