我有一张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"
因为删除不支持偏移量。请问有人在这里有更好的主意吗?
答案 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
);