获取mysql表数据的md5 / sha1哈希值?

时间:2011-04-28 15:12:05

标签: php mysql sql

长话短说,在全局包含的配置文件中,我从表中获取设置,并使用来自数据库表的settingKey,settingVal在我的代码中定义一个常量,现在我认为没有那么多开销,但是如果我最终得到了大量的设置,最好检查一下它们是否已经改变了,如果是这样的话,那就更好了。否则不会。

所以底线,我应该/我可以得到一个表的哈希并将其与最后一个已知的表哈希进行比较,以查看值是否已更改?或者我是否以完全错误的方式解决这个问题,并且有一种更有效的方法?

谢谢!

3 个答案:

答案 0 :(得分:5)

创建一个触发器,在日志表中写入上次更新的时间等。

CREATE TABLE LOG (
  id integer PRIMARY KEY AUTOINCREMENT,
  tablename varchar NOT NULL,
  action ENUM('insert','delete','update') NOT NULL,
  action_time DATETIME NOT NULL)

DELIMITER $$

CREATE TRIGGER ai_table1 AFTER INSERT ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'insert', NOW())
END$$

CREATE TRIGGER ad_table1 AFTER DELETE ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'delete', NOW())
END$$

CREATE TRIGGER au_table1 AFTER UPDATE ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'update', NOW())
END$$

DELIMITER ;

请注意,触发器执行触发FOR EACH ROW,因为您只需要更改发生的日期,这会使触发器在执行多次更新时稍微加快(并且日志会稍微缩短) /删除/插入。

<强>链接:
触发器:http://dev.mysql.com/doc/refman/5.1/en/triggers.html

答案 1 :(得分:2)

时间戳会更容易,例如。

SELECT * FROM table WHERE last_modified > somedate

MySQL甚至会自动更新last_modified列,如下所示:

ALTER TABLE table
    ADD last_modified TIMESTAMP 
        DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP;

然后,只要您提取设置,只需记下时间戳,然后在下次需要检查时使用。

答案 2 :(得分:0)

嗯,最好将设置缓存在某个位置(在文件中,在memcachedAPC中),如果某些设置发生更改,则只会使缓存无效。

不需要散列表,因为在某些情况下,表文件的散列可以在不更改其内容的情况下更改(例如,InnoDb自适应索引)。