是否有可能在一周内自动将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
Run Code Online (Sandbox Code Playgroud)
搬家后
表A:
ID | stringvalue | Timestamp
4 | abc4 | 2011-10-10
5 | abc5 | 2011-10-11
Run Code Online (Sandbox Code Playgroud)
Table_Archive:
ID | stringvalue | Timestamp
1 | abc | 2011-10-01
2 | abc2 | 2011-10-02
3 | abc3 | 2011-10-05
Run Code Online (Sandbox Code Playgroud)
当新输入进入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
Run Code Online (Sandbox Code Playgroud)
如何将_now更改为3天前的日期?
Tom*_*Mac 11
就个人而言,我会使用MySQL事件调度程序.这是一个内置的事件调度程序,而不像Linux中的CRON.
您可以指定它来调用过程,过程或函数,或者以指定的时间间隔运行一些SQL.
阅读MySQL文档,但一个例子是:
CREATE EVENT mydatabase.myevent
ON SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
DO
call clean_tables();
Run Code Online (Sandbox Code Playgroud)
所以这就是说"每周一次打电话给clean_tables(),并在10分钟内拨打第一个电话"
一个问题是,事件调度程序(我认为)默认是禁用的.要打开它:
SET GLOBAL event_scheduler = ON;
Run Code Online (Sandbox Code Playgroud)
然后你可以运行:
SHOW PROCESSLIST;
Run Code Online (Sandbox Code Playgroud)
查看事件调度程序线程是否正在运行.
至于保留表A ID列(如果必须).我会将Table_Archive上的ID保持为该表的唯一ID,即将其设置为主键和auto_increment,然后在其中存储用于存储TableA ID的"Original_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
);
Run Code Online (Sandbox Code Playgroud)
似乎没有人回答你原来的问题"我如何改变_现在是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 ;
Run Code Online (Sandbox Code Playgroud)
最后一点是,您应该考虑在TableA上的timestamp列上创建索引,以提高clean_tables()过程的性能.
您可能需要查看cron jobs是否希望自动执行该脚本/查询。
如果您正在使用,cpanel请查看http://www.siteground.com/tutorials/cpanel/cron_jobs.htm
| 归档时间: |
|
| 查看次数: |
14257 次 |
| 最近记录: |