Удалить строки из таблицы, кроме указанного числа (предельное количество строк)

#mysql #sql

#mysql #sql

Вопрос:

Как удалить все строки из таблицы MYSQL (2 миллиона строк), сохраняя, например. последние 100.

Запрос для выбора того, что я хочу сохранить, будет:

  SELECT id FROM mytable ORDER by date DESC LIMIT 100;
  

Итак, мне нужен запрос, который удаляет все строки, кроме выбранных в этом запросе. Ускоренное использование списка идентификаторов where in кажется излишним.

Комментарии:

1. Что касается вставки 100 строк во временную таблицу, сократите таблицу, из которой вы удаляете, затем вставьте эти 100 строк обратно в основную таблицу.

Ответ №1:

Может быть, вы могли бы попробовать что-то вроде этого :

 DELETE FROM mytable
WHERE id NOT IN (SELECT id FROM mytable ORDER by date DESC LIMIT 100)
  

Ответ №2:

DELETE FROM mytable WHERE date < (SELECT date FROM mytable ORDER BY date DESC LIMIT 100,1)

попробуйте это

Он должен удалить все записи, кроме последних 100 записей на основе date столбца

редактировать: опечатки

Комментарии:

1. У вас опечатка с 1),100 . Также вы предполагаете, что идентификатор находится в порядке по дате — это может быть не так.

2. Это выглядит неправильно — это смещение 100, количество строк 1.

3. @Ariel: OP хочет, чтобы верхние 100 записей были неповрежденными, а остальные удалить. И, следовательно, установлено смещение.

4. ОГО! Да, вы правы, я неправильно понял ваш запрос, проголосуйте.

5. Возможная ошибка: если дата не уникальна, может сохраниться более 100 строк, если дата в 100-й строке дублируется. Вероятно, для этого это не имеет значения.

Ответ №3:

Вы можете использовать подготовленную инструкцию. Я тестировал на MySQL, и это работает.

 PREPARE row_del FROM 'DELETE FROM mytable LIMIT ?'
; 

SELECT @row_num := count(*) - 100
FROM mytable
;

EXECUTE row_del USING @row_num
;