是否有可能使用DB-triggers在postgres数据库中设置最大表大小?
例如,假设我有一个名为Comments
的表。
从用户的角度来看,这可以尽可能频繁地完成,但是我只想在DB中存储100条最新的评论。所以我想做的是有一个自动维护它的触发器。即当有超过100条评论时,它会删除最旧的评论等。
有人可以帮我写这样的触发器吗?
答案 0 :(得分:2)
我认为触发器是错误的工具;虽然有可能实现这一点。从正在执行的插入物中产生“删除”的东西会使我脖子上的头发竖起来。你会产生很多锁定和可能的争用;和插入通常不应生成锁。
对我而言,这一直是“存储过程”。
但我也认为你应该问自己,“为什么删除”旧的评论?删除是一种诅咒。最好只在显示它们时限制它们。如果您真的担心表的大小,请使用TEXT列。 Postgres会将这些内容保存在影子表中,原始表格的完整扫描就会很好。
答案 1 :(得分:1)
每个用户限制为100条评论非常简单,例如
delete from comments where user_id = new.user_id
order by comment_date desc offset 100;
限制字节大小比较棘手。您需要计算相关的行大小,并且不考虑索引大小,死行等。最好使用admin函数来获取表大小,但这些不会产生每个用户的大小,只有总大小。
答案 2 :(得分:0)
理论上我们可以创建一个包含100个虚拟记录的表,然后用实际的注释覆盖它们。一旦我们通过第100个,我们将覆盖第一个,等等。
这样我们假设保持表的大小相同,但这是不可能的,因为Postgresql中有update is equivalent to delete,insert。因此表的大小将继续增长。
因此,如果目标不是溢出磁盘驱动器,那么一旦磁盘满了80%a"真空充满"应该执行以释放磁盘空间。 "真空吸尘"自己需要磁盘空间。如果您将记录保留为固定数字,则会产生真空效应。似乎还有真空can fail的情况。