2011-01-12 2 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 
); 

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

Спасибо, но я всегда волнуюсь при использовании в -листы - не слишком ли они слишком дороги? –

+0

Не обязательно, особенно если он ограничен 10 строками. Но только план выполнения может сказать ... –

+0

Спасибо (и мне пришлось добавить «desc» выше) –

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

Хороший вопрос о дубликатах. Мое предположение заключалось в том, что * если * были дубликаты, скорее всего их также следует удалить. Но только Александр может сказать –

Смежные вопросы