sql >> Base de Datos >  >> RDS >> Mysql

Consulta SQL:¿Eliminar todos los registros de la tabla excepto el último N?

No puede eliminar los registros de esa manera, el problema principal es que no puede usar una subconsulta para especificar el valor de una cláusula LIMIT.

Esto funciona (probado en MySQL 5.0.67):

DELETE FROM `table`
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM `table`
    ORDER BY id DESC
    LIMIT 42 -- keep this many records
  ) foo
);

La subconsulta intermedia es requerido. Sin él nos encontraríamos con dos errores:

  1. Error de SQL (1093):no puede especificar la tabla de destino 'tabla' para la actualización en la cláusula FROM - MySQL no le permite hacer referencia a la tabla que está eliminando desde una subconsulta directa.
  2. Error de SQL (1235):esta versión de MySQL aún no es compatible con 'LIMIT &IN/ALL/CUALQUIERA/ALGUNAS subconsultas' - No puede usar la cláusula LIMIT dentro de una subconsulta directa de un operador NOT IN.

Afortunadamente, el uso de una subconsulta intermedia nos permite eludir ambas limitaciones.

Nicole ha señalado que esta consulta se puede optimizar significativamente para ciertos casos de uso (como este). Recomiendo leer esa respuesta también para ver si se ajusta a la tuya.