J'aimerais créer une table SQL qui n'a pas plus de n rangées de données. Lorsqu'une nouvelle ligne est insérée, je voudrais que la ligne la plus ancienne soit éliminée pour faire de la place pour le nouveau. P>
Y a-t-il un moyen typique de gérer cela dans SQLite? P>
devrait le gérer avec un code extérieur (tiers)? p>
4 Réponses :
semble que la prise en charge de SQLite pour les déclencheurs peut suffire: http://www.sqlite.org/lang_createtrigger.html p>
expansion sur Alex 'Réponse , et en supposant que vous avez un Incrémentation de la colonne de série non répétée sur la table t code> nommée Serial code> qui peut être utilisé pour déterminer l'âge relatif des lignes: 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;
Cela ne serait-il pas toujours supprimer la première rangée?
@Aronchick, non - la sous-requête scalaire évaluera à NULL s'il n'y a pas d'enregistrement dans la 11ème position (après notre insertion de la 11e rangée), et donc la clause où code> devient alors où série <= null code>, qui ne correspond pas à rien.
Et si le IDID est incrémenté automatiquement. Ce code ne pourrait-il pas être accompli avec l'IDID au lieu d'horodatage ou de série? Surtout quand un horodatage ne fait pas toujours partie du schéma de la table ...
@Igorganapolsky, c'est équivalent à ce que j'ai appelé une colonne "série" ci-dessus, oui.
Que signifie le -1?
@Igorganapolsky, Limite 10, -1 Code> est identique à la limite . 1 offset 10 code>
Qu'en est-il de la taille de la table sur le disque? Cela resterait-il fixe ou continuerait de croître tant que des enregistrements sont ajoutés.
Vous irez probablement dans une impasse en utilisant cette approche. Nous avons essayé quelque chose de similaire dans notre DB SQL Server et lorsque nous avons testé notre système avec JMeter, nous avons trouvé des blocages.
Pourquoi était-il nécessaire de trier Desc? Les anciens horodatages sont censés être enlevés. Ou est-ce à cause de la "limite 10, -1"? Si oui, je pense que cela nous laisse avec 11 articles au lieu de 10. Est-ce possible? Ou est-ce que je fais quelque chose de mal? Quant à la gâchette, N'est-il pas préférable de rendre la condition d'être lorsque la taille est supérieure à la limite maximale requise?
@androidDeveloper, vous devriez peut-être poser une question distincte?
@androidDeveloper, oui c'est à cause du "-1". Non, ça te laisse avec 10 articles. Oui, je suppose que vous faites quelque chose de mal, et nous pouvons aller au fond de celui-ci si nous Voir votre situation exacte . Non, je ne pense pas un déclencheur qui conscient de la taille de la table source (ce qui n'est pas) est meilleur.
@pilcrow ok merci. Ici: Stackoverflow.com/q/62242272/878126
Ce serait quelque chose comme comment vous le feriez. Cela suppose que my_id_column code> est auto-incrémentation et est la colonne de commande de la table. -- 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;
article sur les files d'attente fixes dans SQL: http://www.xaprb.com/blog/2007/01/11/how-to-implement-a-quue-in-sql P>
devrait pouvoir utiliser la même technique pour mettre en œuvre des "lignes de roulement" p>