1

我有一个从 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();
}    
4

3 回答 3

4

TRUNCATE TABLE `tableName`,不是DELETE FROM tableName

这是有关该主题的手册页。

于 2013-03-12T17:35:51.950 回答
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();
于 2017-06-14T16:23:43.147 回答
0

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

于 2013-03-12T17:35:58.103 回答