Ограничить максимальное количество базу данных SQLite таблицы строк

Я ищу, чтобы реализовать своего рода таблицу "журнал действий", где действия пользователя хранятся в таблице sqlite, а затем представлены пользователю, чтобы они могли видеть последнюю активность, которую они сделали. Однако, естественно, я не считаю необходимым хранить каждый бит истории, поэтому мне интересно, есть ли способ настроить таблицу, чтобы начать обрезку старых строк после достижения максимального установленного предела.

например, если предел равен 100, и это сколько строк в настоящее время в таблице есть, когда вставляется другое действие, самая старая строка автоматически удаляется, чтобы всегда было не более 100 строк. Есть ли способ настроить таблицу sqlite для этого? Или мне придется работать на cron?

Уточнение Edit: в любой момент я хотел бы отобразить последние 100 (например) действий/событий (строк) таблицы.

3 ответов


другое решение-предварительно создать 100 строк и вместо INSERT использовать UPDATE обновить старые строки.
Предполагая, что таблица имеет


вы можете создать триггер это срабатывает при вставке, но лучший способ подойти к этому, может быть, просто иметь запланированное задание, которое выполняется периодически (скажем, раз в неделю) и удаляет записи из таблицы.


есть несколько способов ограничения таблица до 100 строк. (Для краткости, 5 строк в коде ниже.) Протестировано в SQLite версии 3.7.9.

весь этот код зависит от своего рода причуды в том, как SQLite обрабатывает объявления типов данных. (По крайней мере, мне это кажется странным.) SQLite позволяет вставлять глупости, такие как 3.14159 и "wibble", в голый целочисленный столбец. Но он позволяет вставлять только целые числа в столбец, объявленный integer primary key или integer primary key autoincrement.

ограничение внешнего ключа

используйте ограничение внешнего ключа для таблицы допустимых номеров идентификаторов, чтобы гарантировать, что номера идентификаторов находятся в нужном диапазоне. Ограничения внешнего ключа работают даже на автоинкрементных столбцах.

pragma foreign_keys=on;
create table row_numbers (n integer primary key);

insert into row_numbers values (1);
insert into row_numbers values (2);
insert into row_numbers values (3);
insert into row_numbers values (4);
insert into row_numbers values (5);

create table test_row_numbers (
  row_id integer primary key autoincrement,
  other_columns varchar(35) not null,
  foreign key (row_id) references row_numbers (n)
);

insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');
insert into test_row_numbers (other_columns) values ('s');

шестая вставка завершается с ошибкой "ошибка: сбой ограничения внешнего ключа".

Я не думаю использование автоинкремента полностью безопасно. На других платформах откат оставил бы пробел в последовательность. Если вы не используете автоинкремент, вы можете безопасно вставлять строки, выбирая идентификационный номер из "row_numbers".

insert into test_row_numbers values
(
  (select min(n) 
   from row_numbers 
   where n not in 
     (select row_id from test_row_numbers)), 
  's'
);

проверить() ограничение

ограничение первичного ключа ниже гарантирует, что идентификационные номера будут целыми числами. Ограничение CHECK () гарантирует, что целые числа будут находиться в правильном диапазоне. Ваше приложение может по-прежнему иметь дело с пробелами, вызванными откатами.

create table test_row_numbers (
  row_id integer primary key autoincrement,
  other_columns varchar(35) not null,
  check (row_id between 1 and 5)
);