2010-09-08 20 views
17

Tengo una base de datos con 1000 registros. Estoy tratando de crear una declaración SQL, de modo que si la cantidad de registros crece por encima de 1000, se eliminan los registros más antiguos (es decir, los registros nuevos que superan los 1000 'reemplazan' los registros más antiguos). Estoy usando SQLite, pero supongo que la sintaxis SQL habitual se ajustará aquí.Eliminar registros más antiguos de la base de datos

+0

Puede obtener más respuestas si incluye algunos detalles del esquema de la tabla. – serg10

+0

Es posible que desee proporcionar más información. ¿Como tienes una marca de tiempo en las columnas? ¿El ID es un GUID o un incremento automático? ¿Cuál es su objetivo para eliminar todas las fechas anteriores a X o existe un límite de 1000 registros? o ¿cuál es el motivo para eliminar estos registros? Podemos responder mejor a tu pregunta entonces. –

+0

Ah, y ¿cuál es tu campo clave principal? o incluso tienes uno? –

Respuesta

35

Si se utiliza un campo de incremento automático, puede escribir fácilmente esta opción para eliminar los más antiguos 100 registros:

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

O, si hay tal campo está presente, utilice ROWID:

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

O, para dejar sólo los últimos 1000 registros:

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

Gracias, pero necesitaba un ... límite -1 de compensación 1000 – Seven

+0

Estaba pensando en usar esto también, pero ¿MySQL no usará finalmente los ID eliminados para que esto no funcione más? Dado que ID = 1 estará disponible, se creará una fila más nueva con ID = 1 y luego se eliminará primero ...? – NaturalBornCamper

1

Suponiendo que la tabla tiene una primaria Llave y una columna con una marca de tiempo que indica cuándo se inserta el registro), puede utilizar una consulta en la línea de

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

Para borrar todos los registros excepto el primer registro (min/max id) que puede utilizar:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

¿Realmente responde la pregunta? – voromax

Cuestiones relacionadas