插入pdo之前的空表

时间:2013-03-12 17:34:20

标签: php mysql pdo

我有一个用于从rss文件导入数据的脚本,我想在插入之前清空我的表,所以我的数据库中没有任何旧条目,但我无法正确获取语法,因为没有任何内容删除。

以下是我正在尝试的内容:

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();
}    

修改

我尝试使用Truncate,但我认为我需要删除,因为truncate不会清空/删除任何内容:

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();
}    

3 个答案:

答案 0 :(得分:4)

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

这是 Manual page on the subject.

答案 1 :(得分:1)

我今天尝试过同样的事情,经过大量测试后发现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();

答案 2 :(得分:0)

TRUNCATE TABLE $table将清空表并重置自动编号。