2011-07-31 107 views
3

是否有可能使用DB-triggers在postgres数据库中设置最大表大小?数据库触发器限制Postgres中的最大表大小

例如,假设我有一个名为Comments的表格。

从用户角度来看,这可以尽可能频繁地完成,但是我说我只想将最近的100条评论存储在数据库中。所以我想要做的是有一个自动维护这个的触发器。即当有超过100条评论时,它会删除最旧的评论等。

有人可以帮我写这样的触发器吗?

回答

1

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

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

限制字节大小是棘手的。您需要计算相关的行大小,并且不会考虑索引大小,死行等。最好使用管理函数来获取表大小,但这些大小不会产生每个用户的大小,只有总尺寸。

+2

PostgreSQL中的子句DELETE不支持ORDER BY。你需要使用子查询。 – doctore

2

我认为触发器是工作的错误工具;尽管可以实现这一点。从正在执行的插入物产生“删除”的东西使得我的脖子上的头发站立起来。您将以这种方式产生大量的锁定和可能的争用;和插入通常不应该产生锁。

对我来说这就是所谓的“存储过程”。

但我也认为你应该问自己,“为什么要删除”旧评论?删除是一种诅咒。更好的是在显示它们时限制它们。如果您真的担心表格的大小,请使用TEXT列。 Postgres会将它们保存在一个影子表中,原始表格的全面扫描将会很好地进行。

0

我们理论上可以创建一个包含100个虚拟记录的表格,然后用实际的评论简单地覆盖它们。一旦我们通过了第100个,我们将覆盖第1个,等等。

这样我们假设保持表的大小相同,但这是不可能的,因为Postgresql中的update is equivalent to delete,insert。所以桌子的大小将继续增长。

因此,如果目标不是溢出磁盘驱动器,那么一旦磁盘满了80%,应该执行“真空满”以释放磁盘空间。 “真空满”本身需要磁盘空间。如果你将记录保存到一个固定的数字,那么会有真空的效果。也似乎有真空的情况下can fail