2011-03-11 71 views
5

我有一个将脚本导入到MySQL 5数据库的PHP脚本。 每个脚本只包含UPDATE语句,每个语句在表中更新1行(MyISAM)。即使行数据不变,也要更新MySQL时间戳

如果某行在2天内没有进入这些脚本之一,则必须将其删除。该表有一个时间戳列。但是,当UPDATE语句不更改任何列的时间戳没有更新,我无法告诉该行是否在导入文件中。 即使没有数据更改,是否有强制更新时间戳的方法?

编辑: 进一步说明。

导入文件是包含大约450.000行的gzip文件,每行是1个UPDATE语句。

这里的PHP函数来处理导入文件:

private function ImportFile($filename) { 
    $importfile = gzopen($filename, "r"); 
    if (!$importfile) { 
     throw new Exception("Could not open Gzip file " . $filename); 
    } 

    while (!gzeof($importfile)) { 
     $line = gzgets($importfile, 4096); 
     if (!$line) { 
      throw new Exception("Error reading line number $line Gzip file $filename"); 
     } 

     if (strlen(trim($line)) > 0) { 
      $this->DB->Query($line); 
     } 
    } 

    gzclose($importfile); 
} 
+0

嗨,我真的不明白你的问题,你可以澄清它与一些代码,更新文件的样本或东西吗? – SubniC 2011-03-11 09:13:15

回答

9

你可以简单地对所有的字段未更新,其中的更新,例如:

UPDATE mytable SET timestamp=NOW() WHERE id IN (1, 5, 6, ...); 
+0

大多数这些导入文件更新大约450.000行,我将不得不解析每个更新语句以获取主键。我希望有一个更简单的方法。 – klennepette 2011-03-11 09:16:32

+0

我不知道你是否可以编辑你的脚本,但你可以强制每个UPDATE语句有一个SET时间戳= NOW()。 – 2011-03-11 09:21:21

+0

这确实值得思考,创建脚本的应用程序是旧的Powerbuilder 9应用程序。如果我们在那里做出改变,我们不得不将这些改变部署给我们的客户。但也许我可以在PHP脚本中使用它,将它添加到每一行中。如果我诉诸于,我将这个答案标记为接受 – klennepette 2011-03-11 09:28:15

3

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

与使用NOW()类似 - 只要TIMESTAMP列不允许NULL值,您可以通过将该列设置为NULL来强制更新。

UPDATE mytable SET timestamp=NULL 
+0

是的,我看到[MySQL文档建议](http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html),“你可以初始化或更新任何TIMESTAMP列到当前日期并通过为它分配一个NULL值,除非它已经使用NULL属性定义为允许NULL值。“ – 2014-06-14 17:23:18