我有一个用于从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();
}
答案 0 :(得分:4)
它是TRUNCATE TABLE `tableName`
,而不是DELETE FROM tableName
。
答案 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
将清空表并重置自动编号。