加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql – 将TableA中的行移动到Table-Archive中

发布时间:2021-03-30 14:04:46 所属栏目:MySql教程 来源:网络整理
导读:是否有可能在一周内自动将3天之前的行移动到另一个名为“Table_Archive”的表中? tableA ex: ID | stringvalue | Timestamp1 | abc | 2011-10-012 | abc2 | 2011-10-023 | abc3 | 2011-10-054 | abc4 | 2011-10-105 | abc5 | 2011-10-11 搬家后 表A: ID

是否有可能在一周内自动将3天之前的行移动到另一个名为“Table_Archive”的表中?

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

搬家后

表A:

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保持为该表的唯一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
);

似乎没有人回答你原来的问题“我如何改变_现在是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()过程的性能.

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读