MySQL - Хотите постепенно УДАЛИТЬ что-либо старше, чем х количество строк - PullRequest
1 голос
/ 07 февраля 2020

У меня раздутая таблица без поля метки времени. Таким образом, лучший способ, которым я придумал, чтобы очистить эту таблицу, состоит в том, чтобы сохранить самые последние 7 000 000 строк (работает с данными за 1 год).

Я пытался использовать MAX (primary_id) - 7000000 и удалять все, что старше этого, с шагом 500 (LIMIT).

DELETE
FROM tblBloat
WHERE (Select MAX(primaryID) - 7000000 from tblBloat) > primaryID
ORDER BY primaryID desc
LIMIT 500

Это, однако, возвращает ошибку "Вы не можете указать целевую таблицу 'tblBloat' для обновления в предложении FROM.

Также попытался это сделать, однако mySQL не похоже на JOIN в операторе DELETE:

DELETE 
FROM tblBloat
INNER JOIN (select MAX(primaryID) - 7000000 as 'max'
FROM tblBloat) ab
WHERE primaryID < ab.max
ORDER BY primaryID DESC
LIMIT 500

Есть идеи?

1 Ответ

1 голос
/ 07 февраля 2020

Получите наибольший идентификатор, который необходимо удалить, с помощью:

set @max_delete_id = (
  select primaryID
  from tblBloat
  order by primaryID desc
  limit 1
  offset 7000000
);

Затем удалите все строки с одинаковыми или меньшими идентификаторами:

delete
from tblBloat
where primaryID <= @max_delete_id
limit 500;

Затем повторяйте второй запрос, пока не будет строк затронуты.

Хотя я бы использовал более высокий LIMIT (возможно, 10000) или пропустил LIMIT.

Обычный обходной путь для вашего запроса - заключить подзапрос в производную таблицу . (подзапрос в предложении FROM):

DELETE
FROM tblBloat
WHERE (SELECT * FROM (Select MAX(primaryID) - 7000000 from tblBloat)x) > primaryID
ORDER BY primaryID desc
LIMIT 500

Но учтите, что primaryID может иметь пробелы по нескольким причинам, и вы будете хранить менее 7 миллионов строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...