我有一个数据库密集型应用程序,需要每隔几个小时运行一次。有没有办法检测自上次运行此应用程序以来给定的表是否已更改?
答案 0 :(得分:9)
检测更改的最有效方法是这样做。
CHECKSUM TABLE tableName
答案 1 :(得分:1)
几个问题:
命令[http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html](SHOW TABLE STATUS)可以显示一些信息,具体取决于存储引擎。
它还取决于您的密集操作之间的间隔有多大。
我认为最精确的方法是使用@Neuticle提到的触发器(AFTER INSERT / UPDATE),并将CURRENT_TIMESTAMP存储在表名旁边。
CREATE TABLE table_versions(
table_name VARCHAR(50) NOT NULL PRIMARY KEY,
version TIMESTAMP NOT NULL
);
CREATE TRIGGER table_1_version_insert AFTER INSERT
ON table_1
FOR EACH ROW
BEGIN
REPLACE INTO table_versions VALUES('table_1', CURRENT_TIMESTAMP);
END
答案 2 :(得分:0)
您是否可以在要插入的表上设置触发器以添加到插入日志表中?如果这样可行,您只需要在每次运行时读取日志表。
答案 3 :(得分:0)
使用时间戳。根据您的需要,您可以将其设置为更新新行,或仅更改现有行。去这里看一个参考:
http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
答案 4 :(得分:0)
在运行之间检测表更改的常用方法是使用如下查询:
SELECT COUNT(*),MAX(t) FROM table;
但为了实现这一点,对你的桌子必须做出一些假设:
t
列的默认值为NOW()t
列设置为NOW()。对表进行的任何正常更改都将导致上述查询的输出发生变化:
有一些竞争条件可以使这种检查在某些情况下不起作用。
答案 5 :(得分:-1)
使用了CHECKSUM TABLE表名,这非常有效。
从AJAX请求调用它来检查表更新。如果发现更改,则执行屏幕刷新。
对于数据库“myMVC”和表“detail”,它返回一行,字段“table”和“Checksum”分别设置为“mymvc.detail”和“521719307”。