Postgres 更新限制

uns*_*age 5 postgresql database-design postgresql-9.5

我很好奇 Postgres 是否有任何可以限制为 ID 保留的行数的地方。

例如,假设我有一个 users 表和 login_coordinates 表。每次用户登录时,最新的坐标都会输入到用户表中的一列,并插入到 login_coordinates 表中。

我只想保留最后 10 条记录,并删除所有用户的 login_coordinates 表中的第 11 条(最旧)记录。

用户

   user_id            | current_coordinates        |    
----------------------+----------------------------+
    1                 | aaaa.bbbbb, aaaaa.bbbbbb   |    
    2                 | zzzz.xxxxxx, xxxxx.xxxcxx  |    
    3                 | dddd.xxxxxx, xxxxx.xxxcxx  |  
Run Code Online (Sandbox Code Playgroud)

登录坐标

  coordinates_id      | old_login_coordinates      |        user_id           |
----------------------+----------------------------+--------------------------+
    1                 | aaaa.bbbbb, aaaaa.bbbbbb   |     1                    |
    2                 | xxxxx.xxxxxx, xxxxx.xxxcxx |     1                    |
    3                 | xxxxx.xxxxxx, xxxxx.xxxcxx |     1                    |
Run Code Online (Sandbox Code Playgroud)

是否有任何将记录限制为每个用户 10 个坐标标识的东西,总是删除最旧的记录?

我正在使用 PostgreSQL 9.5。

Erw*_*ter 5

以及插入到login_cooperatives表中

我没有看到冗余存储的好处。只需写入表即可login_coordinates。每个用户只需 10 行即可轻松访问。也不要更新用户行。

基本上,@Ziggy 已经建议了,有更多的肉。根据此表:

CREATE TABLE login_coordinates (
  login_coordinates_id serial PRIMARY KEY
, user_id integer NOT NULL  -- REFERENCES users
, login_at timestamptz NOT NULL DEFAULT now()
, coordinates point NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

用于OFFSET 9 LIMIT 1选择 nr。10:

DELETE FROM login_coordinates lc
WHERE  login_at <= (
   SELECT login_at
   FROM   login_coordinates
   WHERE  user_id = lc.user_id
   ORDER  BY login_at DESC
   OFFSET 9  -- only found if at least 10 rows present
   LIMIT  1
   )
AND    user_id = 1;

INSERT INTO login_coordinates (user_id, coordinates)
VALUES (1, '(1, 2)');
Run Code Online (Sandbox Code Playgroud)