2010-09-08 4 views
17

J'ai une base de données avec 1000 enregistrements. J'essaie de créer une instruction SQL, donc si le nombre d'enregistrements dépasse 1000, les enregistrements les plus anciens sont supprimés (c'est-à-dire que les nouveaux enregistrements au-dessus de 1000 'remplacent' les enregistrements les plus anciens). J'utilise SQLite, mais je suppose que la syntaxe SQL habituelle va ici.Supprimer les enregistrements les plus anciens de la base de données

+0

Vous obtiendrez peut-être plus de réponses si vous incluez des détails de schéma de table. – serg10

+0

Vous pouvez fournir plus d'informations. Comme avez-vous un horodatage sur les colonnes? L'identifiant est-il un GUID ou un incrément automatique? Quel est votre objectif pour supprimer toutes les dates plus anciennes que X ou y a-t-il une limite de 1000 enregistrements? ou quelle est la raison de la suppression de ces enregistrements? Nous pouvons mieux répondre à votre question ensuite. –

+0

Oh et quel est votre champ clé primaire? ou en avez-vous même un? –

Répondre

35

Si vous utilisez un champ incrémentation automatique, vous pouvez facilement écrire cette option pour supprimer les plus anciens 100 enregistrements:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable ORDER BY id ASC LIMIT 100) 

Ou, si aucun champ est présent, utilisez ROWID:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID ASC LIMIT 100) 

Ou, pour ne laisser que les 1000 derniers enregistrements:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID DESC LIMIT -1 OFFSET 1000) 
+1

Merci, mais j'avais besoin d'un ... limite -1 offset 1000 – Seven

+0

Je pensais à l'utiliser aussi, mais MySQL n'utilisera-t-il pas éventuellement les ID précédemment supprimés pour que ça ne marche plus? Puisque ID = 1 sera disponible, une ligne plus récente sera créée avec ID = 1, puis sera supprimée en premier. – NaturalBornCamper

1

en supposant que votre table a une primaire Clé et une colonne avec un horodatage indiquant le moment où l'enregistrement a été inséré), vous pouvez utiliser une requête le long des lignes de

delete from tableToDeleteFrom 
where tablePK in 
(select tablePK 
from tableToDeleteFrom 
where someThresholdDate <= @someThresholdDate) 
-3

Pour supprimer tous les enregistrements à l'exception du premier enregistrement (min/id max), vous pouvez utiliser:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

Est-ce que ça répond vraiment à la question? – voromax

Questions connexes