Ви можете визначити тригер для підтримки потрібного номера рядка:
CREATE OR REPLACE FUNCTION trf_keep_row_number_steady()
RETURNS TRIGGER AS
$body$
BEGIN
-- delete only where are too many rows
IF (SELECT count(id) FROM log_table) > rownum_limit
THEN
-- I assume here that id is an auto-incremented value in log_table
DELETE FROM log_table
WHERE id = (SELECT min(id) FROM log_table);
END IF;
END;
$body$
LANGUAGE plpgsql;
CREATE TRIGGER tr_keep_row_number_steady
AFTER INSERT ON log_table
FOR EACH ROW EXECUTE PROCEDURE trf_keep_row_number_steady();
Це, мабуть, не найкращий варіант, але як тільки ви досягнете межі, він ніколи не буде перевищений. Якщо є місце для коливання, то ви можете періодично перевіряти номер рядка та видаляти зайві рядки з початку.
EDIT:
Якщо у вас справді великі журнали (скажімо, мільйон на місяць),найпростішим рішенням може стати розділення . Потім можна просто скинути непотрібні таблиці (сказати кудиmax(timestamp) < CURRENT_DATE - 1 year). Ви можете використовувати свою часову позначку (або похідну дату) як умову для розділення діапазону .
Але будьте обережні, перш ніж викидати старі журнали. Ви впевнені, що вони вам ніколи не знадобляться?