Лично я бы использовал MySQL Event Scheduler . Это встроенный планировщик событий, похожий на CRON в Linux.
Вы можете указать его для вызова процедуры, процедур или функций или запуска SQL-кода через определенные интервалы.
Прочитайте документы MySQL, но пример будет:
CREATE EVENT mydatabase.myevent
ON SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
DO
call clean_tables();
Таким образом, это говорит "вызывайте clean_tables () один раз в неделю и сделайте первый вызов за 10 минут"
Одно замечание: планировщик событий (я думаю) отключен по умолчанию. Чтобы включить его, выполните:
SET GLOBAL event_scheduler = ON;
Затем вы можете запустить:
SHOW PROCESSLIST;
Чтобы проверить, запущен ли поток планировщика событий.
Что касается сохранения вашего столбца идентификатора таблицы A (если необходимо). Я бы оставил идентификатор Table_Archive уникальным для этой таблицы, то есть сделал бы его первичным ключом & auto_increment, а затем имел бы столбец «Original_TableA_ID», в котором нужно сохранить идентификатор TableA. Вы можете поставить уникальный индекс на это, если хотите.
Таким образом, Table_Archive будет выглядеть так:
create table `Table_Archive` (
ID int unsigned primary key auto_increment, -- < primary key auto increment
tableAId unsigned int not null, -- < id column from TableA
stringValue varchar(100),
timestamp datetime,
UNIQUE KEY `archiveUidx1` (`tableAId`) -- < maintain uniqueness of TableA.ID column in Archive table
);
Кажется, никто не ответил на ваш первоначальный вопрос "Как я могу изменить дату на 3 дня назад?". Вы делаете это, используя INTERVAL
:
DELIMITER $
CREATE PROCEDURE clean_tables ()
BEGIN
BEGIN TRANSACTION;
DECLARE _now DATETIME;
SET _now := NOW();
INSERT
INTO Table_Archive
SELECT *
FROM TableA
WHERE timestamp < _now - interval 3 day;
FOR UPDATE;
DELETE
FROM TableA
WHERE timestamp < _now - interval 3 day;
COMMIT;
END$
DELIMITER ;
И наконец, вам следует подумать о создании индекса в столбце меток времени в Таблице A, чтобы повысить производительность процедуры clean_tables ().