Rozszerzając Alex' answer i zakładając mieć przyrost, nie powtarzając kolumnę seryjny na stole t
nazwie serial
które mogą być używane do określenia względnego wieku wierszy:
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;
To nic zrobić, gdy masz mniej niż dziesięć wierszy, a DELETE
najniższą seryjny gdy INSERT
doprowadziłaby do jedenastu wierszy.
UPDATE
Oto nieco bardziej skomplikowany przypadek, gdzie rekordy tabeli „wiek” z wiersza w kolumnie, która może zawierać duplikaty, jak na przykład kolumnę TIMESTAMP
śledzenia razy wkładki.
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;
Tu bierzemy za pewnik, że nie możemy używać id
do określenia względnej wiek, więc usunąć wszystko po pierwszych 10 wierszy zamówionych przez datownik. (SQLite narzuca arbitralne zamówienie na wiersze mające ten sam numer ts
).
nie będzie to zawsze usunąć pierwszy wiersz? – aronchick
@aronchick, nie - skalarne podzapytanie oceni na NULL, jeśli nie ma rekordu na 11 pozycji (PO naszej INSERT prawdopodobnie z 11 rzędu), a zatem klauzula "WHERE" staje się "WHERE serial <= NULL", który nie pasuje do niczego. – pilcrow
Co zrobić, jeśli _id jest automatycznie zwiększany. Nie można tego kodu wykonać za pomocą _id zamiast TIMESTAMP lub serial? Zwłaszcza gdy TIMESTAMP nie zawsze jest częścią schematu tabeli ... –