Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SQL:usunąć wszystkie rekordy z tabeli z wyjątkiem ostatniego N?

Nie możesz usunąć rekordów w ten sposób, głównym problemem jest to, że nie możesz użyć podzapytania do określenia wartości klauzuli LIMIT.

To działa (testowane w 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
);

Podzapytanie pośrednie jest wymagany. Bez tego napotkalibyśmy dwa błędy:

  1. Błąd SQL (1093):nie można określić „tabeli” tabeli docelowej do aktualizacji w klauzuli FROM - MySQL nie pozwala na odwoływanie się do usuwanej tabeli z poziomu bezpośredniego podzapytania.
  2. Błąd SQL (1235):Ta wersja MySQL nie obsługuje jeszcze podzapytania „LIMIT &IN/ALL/ANY/SOME” - Nie możesz użyć klauzuli LIMIT w bezpośrednim podzapytaniu operatora NOT IN.

Na szczęście użycie pośredniego podzapytania pozwala nam ominąć oba te ograniczenia.

Nicole zwróciła uwagę, że to zapytanie można znacznie zoptymalizować pod kątem niektórych przypadków użycia (takich jak ten). Polecam przeczytanie tej odpowiedzi również, aby sprawdzić, czy pasuje do twojego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zoptymalizować wydajność MySQL za pomocą MySQLTuner

  2. Sortowanie w MySQL przy użyciu kolejności według klauzul

  3. Podstawowe polecenia administracyjne bazy danych MySQL – część I

  4. Jak przechowywać datę i godzinę w MySQL z informacją o strefie czasowej?

  5. Usuń zapytanie, aby usunąć wiersze w MySQL