【问题标题】:How do I copy a table which has been updated within the last 5 minutes?如何复制最近 5 分钟内更新的表格?
【发布时间】:2021-12-22 02:16:59
【问题描述】:

我正在尝试检测表是否在过去 5 分钟内更新,如果是,则制作一份副本。我可以为这两个部分创建查询,但是我正在努力寻找一种合适的方式来组合它们。

第 1 部分 - 检测更新:

SELECT *
FROM `INFORMATION_SCHEMA`.`TABLES`
   WHERE 
    DATE_SUB(NOW(), INTERVAL 5 HOUR_MINUTE) < `UPDATE_TIME`
    AND TABLE_NAME = 'admin'

第 2 部分 - 制作副本:

CREATE TABLE admin_copy LIKE admin
INSERT admin_copy
SELECT * FROM admin

我们将不胜感激。

【问题讨论】:

  • 该查询将如何检测更新?如果您正在考虑使用UPDATE_TIME,则该列不会在每次修改表时更新
  • 来自手册 Update_time 上次更新数据文件的时间。对于某些存储引擎,此值为 NULL。例如,InnoDB 在其系统表空间中存储多个表,数据文件时间戳不适用。即使对于每个 InnoDB 表在单独的 .ibd 文件中的 file-per-table 模式,更改缓冲也会延迟对数据文件的写入,因此文件修改时间与上次插入、更新或删除的时间不同。对于 MyISAM,使用数据文件时间戳;但是,在 Windows 上,时间戳不会被更新更新,因此该值不准确。
  • 获取innodb表更新时间检查:stackoverflow.com/questions/2785429/…
  • 有趣。尽管表的存储引擎是 InnoDB,但我在测试时成功地使用了 update_time(或者我认为是这样)。

标签: mysql database


【解决方案1】:

您可以创建第二个表来记录对表的更改并使用触发器来更新上次更改的时间,如 here 所示。

【讨论】:

  • 谢谢。这有助于获得正确的更新时间,但是我的主要问题是编写正确的查询 - 如果我检测到表在前 5 分钟内已更新,那么只有在那时才能创建该表的副本。否则什么都不做。
【解决方案2】:

看看这是否有效

CREATE TABLE admin_copy LIKE admin; 
INSERT admin_copy SELECT * FROM admin WHERE `UPDATE_TIME` BETWEEN (DATE_SUB(NOW(),INTERVAL 5 MINUTE)) AND NOW();

【讨论】:

  • 你从哪里得到UPDATE_TIME?您假设 admin 表上存在 UPDATE_TIME 并且该列是根据 admin 上的最后一个更新语句更新的
  • @ErgestBasha 是的,要在管理表中添加 UPDATE_TIME 列,并在每次有更新时更新=
  • 感谢 Punith B M,但这会导致语法错误。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多