Переместить строки из таблицы A в таблицу-архив - PullRequest
5 голосов
/ 11 октября 2011

Можно ли автоматически перемещать строки, возраст которых 3 дня, в другую таблицу с именем «Table_Archive» в mysql раз в неделю?

tableA ex:

ID | stringvalue | Timestamp
1  | abc         | 2011-10-01
2  | abc2        | 2011-10-02
3  | abc3        | 2011-10-05
4  | abc4        | 2011-10-10
5  | abc5        | 2011-10-11

После перемещения

tableA:

ID | stringvalue | Timestamp
4  | abc4        | 2011-10-10
5  | abc5        | 2011-10-11

Table_Archive:

ID | stringvalue | Timestamp
1  | abc         | 2011-10-01
2  | abc2        | 2011-10-02
3  | abc3        | 2011-10-05

И когда новый ввод поступает в таблицуA, проблем с идентификатором не будет (PK)) в следующем ходу?

Что я получил:

CREATE PROCEDURE clean_tables ()
BEGIN
    BEGIN TRANSACTION;

    DECLARE _now DATETIME;
    SET _now := NOW();

    INSERT
    INTO    Table_Archive
    SELECT  *
    FROM    TableA
    WHERE   timestamp < _now - 3;
    FOR UPDATE;

    DELETE
    FROM    TableA
    WHERE   timestamp < _now - 3;

    COMMIT;
END

Как мне изменить _ теперь на дату 3 дня назад?

Ответы [ 4 ]

11 голосов
/ 11 октября 2011

Лично я бы использовал 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 ().

0 голосов
/ 29 декабря 2016

Возможно, MySQL выполнит запрос автоматически в определенное время, используя MySQL Event Scheduler. Проверьте эту ссылку для более подробной информации. https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html

0 голосов
/ 08 мая 2012

Добавляя к лучшему ответу (imo) Тома Мака относительно планировщика событий - имейте в виду, что при резервном копировании схемы необходимо указать, что вы хотите, чтобы события были зарезервированы с помощью флага --events = TRUE.

Если вы экспортируете вручную в рабочей среде, последняя версия имеет флажок на главной вкладке «Экспорт на диск» - старые версии скрывают ее на вкладке «Дополнительные параметры экспорта».

0 голосов
/ 11 октября 2011

Вам может понадобиться заглянуть в cron jobs, если вы хотите, чтобы этот скрипт / запрос выполнялся автоматически.

Если вы используете cpanel, загляните в http://www.siteground.com/tutorials/cpanel/cron_jobs.htm

...