2013-03-12 39 views
0

我有一個從rss文件導入數據的腳本,並且我想在插入之前清空我的表,所以我的數據庫中沒有任何舊條目,但是我無法獲取語法對,因爲沒有東西被刪除。插入pdo之前的空表

這裏是我嘗試:

try { 
    $db->beginTransaction(); 

    $stmt = $db->prepare("DELETE FROM $table"); 

    $stmt = $db->prepare("INSERT INTO $table(id,name) VALUES(:id,:name)ON DUPLICATE KEY UPDATE name=:name"); 
    $stmt->execute(array(':id' => $id, ':name' => $name)); 

    $db->commit(); 
} catch(PDOException $ex) { 
    //Something went wrong rollback! 
    $db->rollBack(); 
    echo $ex->getMessage(); 
}  

編輯

我與截斷嘗試過,但認爲我需要刪除自截斷不空/刪除任何東西:

try { 
    $db->beginTransaction(); 

    $stmt = $db->prepare("TRUNCATE TABLE $table"); 

    $stmt = $db->prepare("INSERT INTO $table(id,name) VALUES(:id,:name)ON DUPLICATE KEY UPDATE name=:name"); 
    $stmt->execute(array(':id' => $id, ':name' => $name)); 

    $db->commit(); 
} catch(PDOException $ex) { 
    //Something went wrong rollback! 
    $db->rollBack(); 
    echo $ex->getMessage(); 
}  
+0

很可能是因爲'safe_update's啓用,這意味着你不能沒有條件執行'DELETE' /'UPDATE'。你可能想要的是'TRUNCATE',但是如果你真的想要一個'DELETE',你可以考慮加入:'WHERE id> 0'(因爲它最有可能匹配所有行) – 2013-03-12 17:37:12

+0

有了下面的答案,你知道'DELETE'會使你的'auto_increment'保持當前的編號,'TRUNCATE'會重置它。不要說這是你的情況,只是一些你可能會覺得有用的信息。 – Zak 2013-03-12 17:40:01

+0

@Zak他在查詢中綁定了ID。似乎沒有使用'auto_increment'。當然,誰知道 - 因爲沒有模式定義。 – 2013-03-12 17:43:56

回答

4

這是TRUNCATE TABLE `tableName`,而不是DELETE FROM tableName

這裏的Manual page on the subject.

+1

'DELETE FROM tableName'也是完全有效的語法。這很可能是safe_updates。 – 2013-03-12 17:36:05

+0

^^ ++ @Colin,這取決於他是否希望'auto_increment'被重置...... – Zak 2013-03-12 17:40:41

+0

@Zak不,它的語法是無論如何。 「DELETE」不會重置「auto_increment」是正確的,但這並不意味着語法無效。 – 2013-03-12 17:43:30

0

TRUNCATE TABLE $table將清空表,重置自動編號。

0

今天我嘗試了同樣的事情,經過大量測試後發現TRUNCATE實際上無法回滾,因此您可能需要考慮這一點。

一個簡單的測試是如果你添加一個新的記錄到你的表然後運行你的腳本。該記錄應該被刪除,但在我的例子中,它仍然存在。

這裏是從我的代碼示例片段:

$dbh->beginTransaction(); 

try { 

     $stmt = $dbh->prepare("DELETE FROM trade_customer"); 
     $stmt->execute(); 
     $stmt = $dbh->prepare("INSERT IGNORE trade_customer SELECT * FROM cp_imp_customer"); 
     $stmt->execute(); 

} 

catch(PDOException $Exception) { 
    echo "FAILED - " . $Exception->getMessage() . "(" . (int)$Exception->getCode() . ") - " . date('Y-m-d H:i:s') . "\n"; 
    echo "Transaction ended, no changes were made to the live table" . date('Y-m-d H:i:s') . "\n"; 
    die; 
} 

// commit on success 
$dbh->commit();