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。
以及插入到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)
归档时间: |
|
查看次数: |
1228 次 |
最近记录: |