Ampliando Alex' answer, e supponendo che si hanno un'incrementazione, non ripetibile colonna di serie sul tavolo t
denominata serial
che può essere usato per determinare l'età relativa delle righe:
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;
Questo non farà nulla quando si hanno meno di dieci righe, e si DELETE
il serial più basso quando un INSERT
si spingerebbe a undici righe.
UPDATE
Ecco un caso un po 'più complicato, dove i vostri tavolo record "età" di riga in una colonna che può contenere duplicati, come ad esempio una colonna TIMESTAMP
il monitoraggio dei tempi di inserimento.
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;
Qui diamo per scontato che non possiamo usare id
per determinare l'età relativa, così abbiamo eliminare tutto dopo le prime 10 righe in ordine di data e ora. (SQLite impone un ordine arbitrario su righe che condividono lo stesso ts
).
non sarebbe questa eliminare sempre la prima fila? – aronchick
@aronchick, no - la sottoquery scalare valuterà su NULL se non c'è nessun record in undicesima posizione (DOPO il nostro INSERT di possibilmente l'undicesima riga), quindi la clausola 'WHERE' diventa' WHERE serial <= NULL', che non corrisponderà a nulla. – pilcrow
Cosa fare se _id viene incrementato automaticamente. Non è possibile eseguire questo codice con _id anziché TIMESTAMP o seriale? Soprattutto quando un TIMESTAMP non fa sempre parte dello schema della tabella ... –