是否可以每周3天自动将3天之内的行自动移入另一个名为“Table_Archive”的表中?

表A 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

并且当新输入进入tableA时,下一步是否会出现ID(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

如何将_now更改为3天之前的日期?

最佳答案

就个人而言,我将使用MySQL Event Scheduler。这是一个内置的事件调度程序,就像Linux中的CRON一样。

您可以指定它来调用过程,过程或函数,或者以指定的间隔运行一些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 ID”列(如果需要)。我会将Table_Archive上的ID保留为该表唯一,即使其成为主键和auto_increment,然后具有一个“Original_TableA_ID”列,用于存储TableA ID。如果需要,可以对此添加唯一索引。

因此,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
);

似乎没有人回答您最初的问题“我如何将_now更改为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 ;

最后一点是,您应该考虑在TableA的timestamp列上创建索引,以提高clean_tables()过程的性能。

关于mysql - 将行从TableA移到Table-Archive,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7724824/

10-15 18:06