首页 > 解决方案 > 如何运行无缓冲的 SELECT 并同时运行另一个 INSERT?(PHP,MYSQLI_USE_RESULT,命令不同步;您现在无法运行此命令)

问题描述

我必须从主表中过滤和添加记录。该表有数百万条记录。首先我尝试:

$result = mysqli_query($myConnection, 'SELECT * FROM master');
while($record = mysqli_fetch_assoc($result))
{
    if ($myConditionsMet)
    {
        mysqli_query($myConnection, 'INSERT INTO filtered VALUES blahblahblah');
    }
}

现在我面临的第一个问题是内存溢出。(是的,我曾经相信通常 Php 不会得到所有的记录,而是一个接一个,所以这是一个最小的内存使用,因为一个记录会擦除以前的记录,但是这个人每天都会学到新的东西)。我遇到了一个有用的标志(MYSQLI_USE_RESULT),所以:

$result = mysqli_query($myConnection, 'SELECT * FROM master', MYSQLI_USE_RESULT);
while($record = mysqli_fetch_assoc($result))
{
    if ($myConditionsMet)
    {
        mysqli_query($myConnection, 'INSERT INTO filtered VALUES blahblahblah');
    }
}

但这一次我得到一个悲惨的错误:Commands out of sync; you can't run this command now。现在,我无法想象如何处理它。即使我将master的记录收集到$array中,仍然内存溢出。我不敢相信我不允许在使用 SELECT FROM 获取时运行 INSERT INTO,我看不出两者发生冲突的方式,这没有任何意义。

标签: phpmysqlunbuffered-queries

解决方案


推荐阅读