Postgres中用于限制表最大大小的数据库触发器

4
有没有可能使用DB触发器在postgres DB中设置最大表大小?
例如,假设我有一个名为“Comments”的表。
从用户的角度来看,这可以尽可能频繁地完成,但是我只想在DB中存储最近的100条评论。因此,我想要一个触发器自动维护它。即当超过100条评论时,它会删除最旧的评论等。
能否有人帮我编写这样的触发器?
3个回答

2

我认为触发器不是做这项工作的正确工具,尽管可以实现它。在执行插入操作时生成“删除”操作会让我的头发竖起来。这样做会产生大量锁和可能的争用,而插入操作通常不应该生成锁。

对我来说,这完全是“存储过程”的事情。

但我也认为你应该问自己,“为什么要删除”旧的评论?删除是个大忌。最好只在显示评论时将其限制。如果你真的担心表格的大小,可以使用TEXT列。Postgres会在一个影子表中维护这些列,对原始表的完全扫描将很顺畅。


1

限制每个用户的评论数为100条相当简单,例如:

delete from comments where user_id = new.user_id
order by comment_date desc offset 100;

控制字节大小比较棘手。您需要计算相关行的大小,而这不包括索引大小、已删除的行等因素。最好使用管理功能获取表格大小,但这些功能只能提供总大小,不能提供每个用户的大小。


2
在PostgreSQL中,DELETE子句不支持ORDER BY。您需要使用子查询来实现。 - doctore

0

理论上,我们可以创建一个包含100个虚拟记录的表,然后用实际的评论覆盖它们。一旦超过第100条记录,就会覆盖第一条记录等。

这样做的目的是保持表的大小不变,但这是不可能的,因为在Postgresql中,update相当于delete,insert。因此,表的大小将继续增长。

因此,如果目标不是使磁盘驱动器溢出,那么一旦磁盘使用率达到80%,应执行“vacuum full”以释放磁盘空间。“Vacuum full”本身需要磁盘空间。如果您将记录保留为固定数量,则会产生真空效果。此外,似乎有些情况下真空可能失败


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接