Mysql
 sql >> Database >  >> RDS >> Mysql

Query SQL:elimina tutti i record dalla tabella tranne l'ultimo N?

Non è possibile eliminare i record in questo modo, il problema principale è che non è possibile utilizzare una sottoquery per specificare il valore di una clausola LIMIT.

Funziona (testato in 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 sottoquery intermedia è necessario. Senza di essa ci imbatteremmo in due errori:

  1. Errore SQL (1093):non è possibile specificare la tabella di destinazione 'table' per l'aggiornamento nella clausola FROM - MySQL non ti consente di fare riferimento alla tabella da cui stai eliminando all'interno di una subquery diretta.
  2. Errore SQL (1235):questa versione di MySQL non supporta ancora "LIMIT &IN/ALL/ANY/SOME subquery" - Non è possibile utilizzare la clausola LIMIT all'interno di una subquery diretta di un operatore NOT IN.

Fortunatamente, l'utilizzo di una sottoquery intermedia ci consente di aggirare entrambe queste limitazioni.

Nicole ha sottolineato che questa query può essere ottimizzata in modo significativo per determinati casi d'uso (come questo). Consiglio di leggere quella risposta anche per vedere se si adatta al tuo.