我有以下代码(或多或少)可以导入从 500.000 到 4.000.000 行的任何位置:
$sSql = "Insert into table (a,b,c) VALUES(?,?,?)"
$oSQLStmnt = $pdo->prepare($sSql);
$oSQLStmnt->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
if (!$oSQLStmnt) {
echo $pdo->errorInfo(); // Handle errors
}
$pdo->beginTransaction();
$iLineCounter = 1;
while (($sLine = fgets ($oCSV, 8000)) !== FALSE) {
$aLine = explode('|', $sLine); //Fgetscsv did not work properly
if ($iLineCounter % 100 == 0) {
lo("Inserting row " . $iLineCounter);
$pdo->commit();
sleep(0.15);
$pdo->beginTransaction();
}
try {
$oSQLStmnt->execute($aLine);
$iSuccesulInserts++;
}
catch (exception $e) {
print_r($e);
$iFailedInserts++;
}
$iLineCounter++;
}
$pdo->commit();
如您所见,我每 100 行执行一次提交,甚至添加了一些睡眠。我过去每 25.000 行只运行一次提交,而且我没有使用任何睡眠。然而,在某一时刻,我发现我丢失了记录。我开始使用这些设置(睡眠和行数)。这样,我将丢失记录的数量从 50.000 减少到大约 100。但我仍然缺少记录!他们要去哪?我知道 SQL 没问题,因为当出现问题时我会立即收到错误消息。
我以为我可以在事务期间堆叠很多插入?调用 beginTransaction 会不会有问题?
更新:
赏金结束了,我不得不奖励它。谢谢大家的答案。或者实际上是提示,因为你们都没有真正回答我的问题。尽管非常感谢您的建议,但我并没有要求解决方法。赏金被授予的答案是因为它最接近实际回答我的问题。不幸的是,它没有用。
现在我正在使用 CSV 批量导入,效果很好,但如果有人有任何其他解决此问题的提示,请告诉我。因为我更喜欢使用我原来的方法。