Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL заявка:Изтриване на всички записи от таблицата с изключение на последния N?

Не можете да изтриете записите по този начин, основният проблем е, че не можете да използвате подзаявка, за да посочите стойността на клауза LIMIT.

Това работи (тествано в 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
);

Междинната подзаявка е задължително. Без него бихме се сблъскали с две грешки:

  1. SQL грешка (1093):Не можете да посочите целева таблица „таблица“ за актуализиране в клауза FROM - MySQL не ви позволява да се обърнете към таблицата, която изтривате, в рамките на директна подзаявка.
  2. SQL грешка (1235):Тази версия на MySQL все още не поддържа „LIMIT &IN/ALL/ANY/SOME подзаявка“ – Не можете да използвате клаузата LIMIT в директна подзаявка на оператор NOT IN.

За щастие, използването на междинна подзаявка ни позволява да заобиколим и двете ограничения.

Никол посочи, че тази заявка може да бъде оптимизирана значително за определени случаи на употреба (като този). Препоръчвам да прочетете този отговор както и да видите дали отговаря на вашия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталирайте множество MySQL екземпляри на Linux сървър - използвайте отделен конфигурационен файл на MySQL

  2. Най-лесният начин за PHP връзка за проверка на имейл

  3. Онлайн миграция от MySQL 5.6 без GTID към MySQL 5.7 с GTID

  4. SEC_TO_TIME() Примери – MySQL

  5. Възстановете базата данни на mysql от .frm файлове