在表格中保留一定数量的记录

时间:2011-01-12 12:28:26

标签: postgresql plpgsql sql-delete

我有一张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"

因为删除不支持偏移量。请问有人在这里有更好的主意吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
        );