Rolling rows en la tabla de SQL

Me gustaría crear una tabla SQL que no tenga más de n filas de datos. Cuando se inserta una nueva fila, me gustaría eliminar la fila más antigua para dejar espacio para la nueva.

¿Hay una forma típica de manejar esto dentro de SQLite?

¿Debería gestionarlo con algún código externo (de terceros)?

Ampliando la respuesta de Alex , y suponiendo que tiene una columna en serie incremental y no repetitiva en la tabla t llamada serial que se puede usar para determinar la antigüedad relativa de las filas:

  CREATE TRIGGER ten_rows_only AFTER INSERT ON t BEGIN DELETE FROM t WHERE serial <= (SELECT serial FROM t ORDER BY serial DESC LIMIT 10, 1); END; 

Esto no hará nada cuando tenga less de diez filas, y DELETE la serie más baja cuando un INSERT lo lleve a once filas.

ACTUALIZAR

Aquí hay un caso un poco más complicado, donde su tabla registra la "edad" de la fila en una columna que puede contener duplicates , como por ejemplo una columna TIMESTAMP que rastrea los times de inserción.

 sqlite> .schema t CREATE TABLE t (id VARCHAR(1) NOT NULL PRIMARY KEY, ts TIMESTAMP NOT NULL); CREATE TRIGGER ten_rows_only AFTER INSERT ON t BEGIN DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY ts DESC LIMIT 10, -1); END; 

Aquí damos por sentado que no podemos usar la id para determinar la edad relativa, por lo que eliminamos todo después de las primeras 10 filas orderadas por timestamp. (SQLite impone un order arbitrario en las filas que comparten el mismo ts ).

Parece que el soporte de SQLite para desencadenantes puede ser suficiente: http://www.sqlite.org/lang_createtrigger.html

Esto sería algo así como cómo lo harías. Esto supone que my_id_column se my_id_column y es la columna de orderación para la tabla.

 -- handle rolls forward -- deletes the oldest row create trigger rollfwd after insert on my_table when (select count() from my_table) > max_table_size begin delete from my_table where my_id_column = (select min(my_id_column) from my_table); end; -- handle rolls back -- inserts an empty row at the position before oldest entry -- assumes all columns option or defaulted create trigger rollbk after delete on my_table when (select count() from my_table) < max_table_size begin insert into my_table (my_id_column) values ((select min(my_id_column) from my_table) - 1); end; 

artículo sobre queues fijas en sql: http://www.xaprb.com/blog/2007/01/11/how-to-implement-a-queue-in-sql

debería ser capaz de usar la misma técnica para implementar "filas rodantes"