搜索

首页  >  问答  >  正文

在 MySQL 中将数据从一个表复制到另一个表的计划事件返回空结果

在 phpMyAdmin 本地服务器上运行: 我有两个表:user(有数据)和user_t(空)。 它们具有相同的列名、顺序和类型(user_t 表有一个额外的列用于为输入添加时间戳)。

我想创建一个计划事件来检查每个用户日志的时间戳是否具有特定值,如果存在,我想将其复制到user_t 同时从 user 中删除它。非常简单。

删除工作正常。正是 INSERT INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;< CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; 给我带来了麻烦。

这是我用来创建事件的代码:

CREATE EVENT users_u
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO 
INSERT INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;
DELETE FROM user WHERE reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;

但是,它不断返回空结果。所以,我认为我一定做错了什么。 你能发自内心地帮助我让这段代码工作起来吗?毕竟,它来自教程,应该没问题。

我尝试过使用代码,甚至考虑过研究事务,但这对于这种操作来说似乎太庞大了。

编辑

因此,在使用 nbk 的代码之后,我终于弄清楚了,这是对我有用的代码(我概括了表和列名称,这样它们就不会误导任何人):

DELIMITER $$
CREATE EVENT event_name 
ON SCHEDULE EVERY 1 MINUTE 
STARTS CURRENT_TIMESTAMP 
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR 
DO 
    BEGIN 
    INSERT INTO empty_table (col_name1, col_name2, col_name3, col_name4, col_name5) 
    SELECT col_name1, col_name2, col_name3, col_name4, col_name5 FROM data_table WHERE col_name < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; 
    DELETE FROM data_table WHERE col_name < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; 
    END $$
DELIMITER ;

希望它对像我这样的人将来有帮助。 再次感谢 nbk 的快速帮助。非常感谢,当然,您的答案是正确的。

P粉615886660P粉615886660483 天前673

全部回复(1)我来回复

  • P粉092778585

    P粉0927785852023-09-10 00:57:50

    你每分钟运行一次事件并想要输入最后三分钟,我不知道你有那么多新插入,或者你需要一个Python脚本或者这样插入一小时 ==>出于测试目的,我将频率设置为 1 分钟...

    您仍然应该重写您的事件。

    首先,您是否真的想要重复项,也许是INSERT IGNORE,如果违反约束,它将输入新行

    第二,如果你有不止一个语句,你需要一个BEGIN END

    DELIMITER $$
    CREATE EVENT users_u
    ON SCHEDULE EVERY 1 MINUTE
    STARTS CURRENT_TIMESTAMP
    ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO 
        BEGIN
            INSERT IGNORE INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;
            DELETE FROM user WHERE reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;
        END $$
    DELIMITER ;

    回复
    0
  • 取消回复