【问题标题】:Using MySQL triggers to update table with last_modified data使用 MySQL 触发器使用 last_modified 数据更新表
【发布时间】:2012-02-13 01:22:09
【问题描述】:

如何使用触发器来简单地使用上次编辑表格的时间来更新表格?我知道通过使用触发器它是“针对每一行”,但如果有人插入不止一行,那么一遍又一遍地插入或更改表格是毫无意义的。有什么方法可以做到这一点而无需一遍又一遍地这样做?

我希望能够只为所有插入操作一次,而不是一次又一次地完成。如果不是,我想我可以通过包装器强制它。

编辑 1: 那么我想解释一下更多的设计。

我将在另一个数据库中创建一个表来处理诸如聊天或玩家“邮箱”之类的 last_updated 数据,以及另一个用于开发诸如任务、技能、物品等表的数据。我希望能够知道上次更新表的时间,以便在我去扫描表以查看新内容之前轻松查看。

基本上这是我想做的(或类似的事情),我也在使用 PHP,所以它可能是代码中基于 PHP 的方法,但 SQL 应该是一种标准。我不会做完整的代码,而是半可运行的。

last_modified=mysql_query("select last_modified from various_stats.table_last_updated where database_name=`database_name` and `table_name`");
if(last_modified>last_checked_time){
        data_to_get_updated=mysql_query("select something from various_<something>.table_name where last_modified>last_checked_time");
}
else{
     do_nothing;
}

编辑 2:我正在使用 InnoDB,因此我无法使用信息架构的 update_time,因为它永远不会改变。

【问题讨论】:

  • 提供有关您的设计的更多详细信息 - 可能有更好的方法来满足您的需求。
  • 我不知道您还需要什么数据,但我可以提供如何为 table_last_updated 表中的数据构建表。

标签: mysql triggers innodb


【解决方案1】:

如果我走在正确的轨道上,这会对你有帮助吗:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
AND TABLE_NAME = 'tabname'

上面的解决方案是针对 myisam 的,对于 innodb 来说,规范是设置一个调度脚本,这可以设置为一个 cron 作业或一个 windows 调度任务,如果你对你的 web 主机没有那种控制,你可以可能在您的办公室设置一个小型服务器并从那里运行 cron。如果您每说 20 秒执行一次,您可以简单地记录当前顶部自动递增的 ID 并将其用作指导,如果当前 ID 高于上次记录的 ID,则更新您的记录以显示上次更改的时间为现在。

因为这只会每 XX 秒调用一次服务器,所以它不会对服务器造成太大的冲击,应该在后台静默运行。

如果您确实进入了计划任务的根目录,明智的做法是在脚本中添加错误捕获,以便在某些事情停止工作等时通过电子邮件收到警报。

【讨论】:

  • 如果这个时间与您所拥有的时间不同,您只需获取任何新数据
  • 不,因为它是 InnoDB。遗憾的是,InnoDB 在信息模式中没有 update_time。这就是为什么我什至需要这样做。如果是 MyIsam,那么我肯定会这样做,但遗憾的是我必须解决这个问题。
  • 也许您可以尝试安排事件/触发器以每 xx 分钟或秒处理一次,这样可能会有 20 次插入/更新,但您只会记录一次?
  • 如果有办法让它知道它改变了一些东西,那就太好了。我唯一的事情是我想确保它是半定期更新的。但无论如何,如果它仍然有效,同时仍然允许我不必进行全表扫描,那就太好了。把它放在你的答案中,我很乐意接受。
  • 时间框架也可能会有所不同,但我相信写一次会很好。因为有些人不应该经常改变,而其他人会。所以,是的,把它放在那里,我很乐意接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多