auf Alex' answer erweitern, und vorausgesetzt, Sie haben eine Inkrementierung, sich nicht wiederholende Serien Spalte auf dem Tisch t
namens serial
, die verwendet werden können, das relative Alter der Zeilen zu bestimmen:
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;
das wird nichts tun, wenn Sie weniger als zehn Zeilen, und die niedrigsten Serien DELETE
, wenn ein INSERT
Sie elf Reihen schieben würde.
UPDATE
Hier ist ein etwas komplizierter Fall, wo Ihre Tabellensätze „Alter“ der Zeile in einer Spalte, die Duplikate, wie zum Beispiel einer TIMESTAMP
Spalte Verfolgung der Einsatzzeiten enthalten.
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;
Hier nehmen wir für selbstverständlich, dass wir nicht id
relatives Alter zu bestimmen, verwenden können, so dass wir alles nach den ersten 10 Reihen durch Zeitstempel bestellt löschen. (SQLite erzwingt eine beliebige Reihenfolge in Zeilen, die dasselbe teilen ts
).
würde dies nicht immer löschen Sie die erste Zeile zu implementieren? – aronchick
@aronchick, nein - die skalare Unterabfrage wird auf NULL ausgewertet, wenn an der elften Stelle kein Datensatz vorhanden ist (NACH UNSERER INSERT möglicherweise der 11. Zeile) und die 'WHERE'-Klausel dann zu' WHERE serial <= NULL wird, das wird nichts zusammenbringen. – pilcrow
Was passiert, wenn die _id automatisch inkrementiert wird? Könnte dieser Code nicht mit der _id statt TIMESTAMP oder seriell durchgeführt werden? Vor allem, wenn ein TIMESTAMP nicht immer Teil des Tabellenschemas ist ... –