限制Oracle数据库中的最大行数,并在插入新行时删除旧行

时间:2015-08-26 11:07:25

标签: database oracle

this one基本相同的问题,但由于它已经6年了,我认为可能值得检查Oracle DB是否有任何附加功能。

基本上,我们要做的是确保我们在Oracle DB中的归档表不会变得太大,因此希望设置要保留的最大行数,并将最旧的行删除为插入新行。

我还没有找到任何更简单的方法来做这件事,而不是定期清理cron工作,但我认为值得问的是,是否有其他人知道如何在数据库本身。

编辑回复Florin Ghita的评论:每个交易插入一行。我们正在考虑将数据库限制在大约5千万或1千万行,每天插入大约700 000行(因此总共保留了大约一周的数据),平均每秒8行(虽然高峰时段肯定会看到这个数字至少增加一倍)。

1 个答案:

答案 0 :(得分:2)

如果您希望旧记录在新插入上神奇地消失,我认为这不可行。您可以编写触发器以在插入新记录时删除记录,但是当在插入的同一个表上使用查询时,您会收到错误ORA-04091(例如insert into mytable (a,b) select 123, max(b)+1 from mytable;。< / p>

如果您确定肯定会发生此类冲突,请继续:

create or replace trigger trg_crop_mytable
before insert on mytable for each row
begin
  delete from mytable
  where createdate = (select min(createdate) from mytable)
  and (select count(*) from mytable) = 1000;
end;
但是,我不推荐它,因为我总是害怕改变表错误。

然后,您可以使用范围从1到所需最大行数的记录ID以及循环序列。而不是使用INSERT,然后您将使用基于此列的MERGE,从而在重新使用记录ID时覆盖旧记录。虽然序列中可能存在间隙,但您可能并不总是覆盖最旧的记录。

所以是的,有可能(就像之前一样),但最简单,最干净的仍然是你已经拥有的cron工作。