Ampliando Alex' answer, y suponiendo que tiene una incrementación, que no se repite la columna de serie en la tabla t
llamado serial
que puede ser utilizado para determinar la 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 va a hacer nada cuando tiene menos de diez filas, y se DELETE
la serie más bajo cuando un INSERT
que empujaría a once filas.
ACTUALIZACIÓN
Aquí es un caso un poco más complicado, donde sus registros de la tabla "edad" de la fila en una columna que puede contener duplicados , como por ejemplo una columna TIMESTAMP
seguimiento de los tiempos 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 utilizar id
para determinar la edad relativa, por lo que eliminar todo lo que después de las primeras 10 filas ordenadas por fecha y hora. (SQLite impone un orden arbitrario en las filas que comparten el mismo ts
).
No sería esto siempre eliminar la primera fila? – aronchick
@aronchick, no - la subconsulta escalar evaluará a NULL si no hay registro en la posición 11 (DESPUÉS de nuestro INSERT de posiblemente la fila 11), y entonces la cláusula 'WHERE' se convierte' WHERE serial <= NULL', que no coincidirá con nada. – pilcrow
¿Qué ocurre si el _id se incrementa automáticamente? ¿No se pudo lograr este código con _id en lugar de TIMESTAMP o serial? Especialmente cuando un TIMESTAMP no siempre es parte del esquema de la tabla ... –