SQL在插入后触发器中创建事件

时间:2019-04-17 18:20:55

标签: mysql database triggers

对于我的数据库,我必须以某个unix时间戳记将视频存档,该时间戳记存储在数据库中。因此,我认为创建一个触发器将很容易,该触发器在插入表后运行,然后创建一个事件来安排视频的存档。我编写了以下SQL语句:

CREATE TRIGGER `ArchiveVido_onInsert` AFTER INSERT ON `tableName`FOR EACH ROW
    CREATE EVENT archiveVideo
      ON SCHEDULE AT inserted.Time_to_Archive
      DO
        UPDATE MediaPage SET is_archived = 1;

但是出现以下错误:

#1576 Recursion of EVENT DDL statements is forbidden when body is present

我该怎么做?还是我只是想念一些东西?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您不能在触发器内运行statements that cause an implicit commit。其中包括任何定义或修改数​​据库对象的DDL语句(CREATE EVENT计数)。

https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html说:

  

触发器不能使用显式或隐式开始或结束事务的语句...

相反,您应该定义一个定期运行的常规EVENT,并更新所有需要存档的视频。

 https://cdn.ampproject.org/v0.js (MAIN AMP FILE)
 https://cdn.ampproject.org/v0/amp-ad-0.1.js

确保CREATE EVENT archiveVideo ON SCHEDULE EVERY 1 MINUTE DO UPDATE MediaPage SET is_archived = 1 WHERE is_archived = 0 AND Time_to_Archive < NOW() LIMIT 1000; 上有一个索引,以便优化WHERE子句以匹配要更新的行。

我添加了(is_archived, Time_to_Archive),因此它不会尝试在单个事务中更新太多行。如果给定时间要归档的视频超过1000个,则必须再等1分钟,事件才能再次运行。

相关问题