#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
;