【问题标题】:Keep a certain number of records in a table在一个表中保留一定数量的记录
【发布时间】:2011-01-12 12:28:26
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql plpgsql sql-delete


    【解决方案1】:

    类似的东西(未经测试!)

    从 pref_hand 中删除 哪里 id = _id 并在 (SELECT h2.stamp FROM pref_hand h2 哪里 h2.id = _id ORDER BY stamp DESC 偏移 10);

    【讨论】:

    • 谢谢,但我在使用 in-lists 时总是很担心——它们在性能方面是不是太昂贵了?
    • 不一定,尤其是限制为 10 行时。但是只有执行计划才能告诉...
    • 谢谢(我必须在上面加上“desc”)
    【解决方案2】:

    这个将正确处理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
            );
    

    【讨论】:

    • 关于重复的要点。我的假设是 如果 有重复,很可能它们也应该被删除。但只有亚历山大能说出来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2012-04-12
    • 2019-07-03
    • 2018-10-12
    相关资源
    最近更新 更多