PDO大插入语句

时间:2017-10-24 09:41:56

标签: php mysql pdo

我有一个大型文本文件,其中包含需要在数据库中导入的数据行。但该文件包含300000行,我无法使其工作,因为查询似乎太大了。

$all_inserts    = array();
$count          = 0;
foreach($file as $line) {
    if($count > 0) {
        $modelnummer    = trim(substr($line, 0, 4));
        $datum          = trim(substr($line, 4, 8));
        $acc_nummer     = trim(substr($line, 12, 4));
        $acc_volgnr     = trim(substr($line, 16, 1));
        $prijs          = trim(substr($line, 17,5));
        $mutatiecode    = trim(substr($line, 22,1));
        $all_inserts[] = array($modelnummer, $datum, $acc_nummer, $acc_volgnr, $prijs, $this->quote($mutatiecode));
    }
    $count++;
}
$query = 'INSERT INTO accessoire_model_brommer (modelnummer, datum, acc_nummer, acc_volgnr, prijs, mutatiecode) VALUES ';
$rows  = array();
foreach($all_inserts as $one_insert) {
    $rows[] = '(' . implode(',', $one_insert) . ')';
}
$query .= ' ' . implode(',', $rows);
$db->query($query);

我将上面的代码用于较小的文件,它工作得很好而且速度很快。但它不适用于较大的文件。有人知道更好的阅读和插入此文件的方法吗?

还尝试在事务中每行使用一个insert语句,但它也不起作用。

1 个答案:

答案 0 :(得分:1)

注意:我不知道PDO或SQL对查询长度的确切限制

如果查询看起来太大,也许你可以拼接文本文件,所以不要运行300个值为300k的查询,而是运行100个3000值的查询,即。?

也许你可以创建一个缓冲区,用3000个值填充它并运行查询。清空缓冲区,用下一个3000值填充它并再次运行查询。