2011-03-11 63 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

相關問題