2011-06-29 9 views

Respuesta

32

Para borrar todo menos los últimos 10 registros.

delete 
from test 
where id not in (
    select id 
    from test 
    order by date desc 
    limit 10 
) 
+0

Gracias. ¿Pero cómo sabría cuántos registros necesito eliminar? – ahmd0

+1

No, esa consulta borra todos menos los últimos 10 registros –

+0

Gracias, funcionó. Aunque su instrucción sql no necesita * – ahmd0

1

De acuerdo con la SQLite documentation:

Si SQLite se compila con la opción de tiempo de compilación SQLITE_ENABLE_UPDATE_DELETE_LIMIT, la sintaxis de la instrucción DELETE se extiende mediante la adición de ORDER BY y cláusulas límite.

(...)

Si la sentencia DELETE tiene una cláusula ORDER BY, a continuación, todas las filas que se suprimirían en ausencia de la cláusula LIMIT se ordenan de acuerdo con el ORDER BY. Las primeras M filas, donde M es el valor encontrado al evaluar la expresión cláusula OFFSET, se omiten, y se eliminan las siguientes N, donde N es el valor de la expresión LIMIT. Si quedan menos de N filas después de tener en cuenta la cláusula OFFSET, o si la cláusula LIMIT se evalúa a un valor negativo, entonces se eliminan todas las filas restantes.

Esto permitirá escribir:

DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10 
+0

~ "Si quedan menos de N filas". ¿Qué significa -1 aquí? –

+0

@IgorGanapolsky Observe la última frase del párrafo citado: _si la cláusula LIMIT se evalúa con un valor negativo, entonces todas las filas restantes se eliminan_. –

+0

Entonces, si hay menos de 10 filas en la tabla, ¿se borrarán todas? –

2

mantener sólo los últimos 10 registros, creo invertida.

Para eliminar los registros de más edad 10:

DELETE FROM Table_name 
WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
       OFFSET (select count(*)-10 from Table_name)); 

quiero saber cómo ha funcionado para usted!

+0

¿La fecha debe tener un formato determinado, como aaaa-mm-dd? –

0

Asumiendo que tiene una columna id que es un número secuencial (AUTO INCREMENT), puede utilizar el siguiente:

DELETE FROM table_name 
WHERE id < (
    SELECT MIN(id) 
    FROM (SELECT id 
      FROM table_name 
      ORDER BY id DESC 
      LIMIT num_of_records_to_keep)) 

La misma consulta se puede utilizar cuando se utiliza una columna de marca de tiempo (simplemente reemplazar id con su marca de tiempo columna)

Cuestiones relacionadas