Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入if不存在else更新的最有效方法_Php_Mysql_Pdo - Fatal编程技术网

Php 插入if不存在else更新的最有效方法

Php 插入if不存在else更新的最有效方法,php,mysql,pdo,Php,Mysql,Pdo,stackoverflow.com上已经有了类似的线程,但是没有一个线程解释了如果表中不存在,插入什么是最有效的方法,如果表中不存在,更新什么是最有效的方法,我们假设我们希望一次和经常使用数千条记录 有一个存储ID、sku、仓库ID和数量的表库存 我与一些API通信以获得所有库存的列表,比如说在Amazon中,我想将其与我的系统同步,以便我始终知道在哪个仓库中有多少数量。当然,在某些情况下,对于新SKU,将其保存在数据库中的查询将是插入查询,但对于旧SKU,则是更新查询。当我们必须同步数千条记录

stackoverflow.com上已经有了类似的线程,但是没有一个线程解释了如果表中不存在,插入什么是最有效的方法,如果表中不存在,更新什么是最有效的方法,我们假设我们希望一次和经常使用数千条记录

有一个存储ID、sku、仓库ID和数量的表库存

我与一些API通信以获得所有库存的列表,比如说在Amazon中,我想将其与我的系统同步,以便我始终知道在哪个仓库中有多少数量。当然,在某些情况下,对于新SKU,将其保存在数据库中的查询将是插入查询,但对于旧SKU,则是更新查询。当我们必须同步数千条记录时,执行此操作的最有效方法是什么?还有一点需要补充的是,sku、warehouseid的组合必须是唯一的,因此当我们执行更新时,我们需要首先检查该组合是否不存在,如果存在,我们必须使用插入

请记住,对于插入记录,我一次使用多个insert PDO 1000 insert,因此我可以在1-2秒内技术上执行1000次插入

我正在考虑从库存表中提取所有记录,并将它们保存在一个数组中。然后从API调用中提取所有记录并在代码中进行比较。通过这种方式,我可以指定5000条记录需要更新,10000条记录需要插入。你觉得怎么样?它会比先选择然后插入或更新更快吗?还有什么方法可以用一个查询执行多个更新,就像我插入记录一样

这是我的多重插入函数:

function insert_multiple($table_name, $data)
{
    $db = sitedb('','PDO');
    $sub_data = array_chunk($data, 1000);
    for ($b = 0; $b < count($sub_data); $b++)
    {
        $insert_values = array();
        for ($a = 0; $a < count($sub_data[$b]); $a++)
        {
            $insert_values = array_merge($insert_values, array_values($sub_data[$b][$a]));
            $placeholder[] = '(' . implode(', ', array_fill(0, count($sub_data[$b][$a]), '?')) . ')';
        }

        $sql2    = "INSERT INTO $table_name (" . implode(",", array_keys($sub_data[$b][0])) . ") VALUES " . implode(',', $placeholder) . "";
        $prepare = $db->prepare($sql2);
        try
        {
            $prepare->execute($insert_values);
        }
        catch (PDOException $e)
        {
            echo "<pre>";
            print_r($sub_data[$b]);
            echo "</pre>";
            echo $e->getMessage();
            print_r($db->errorInfo());
        }
        unset($insert_values);
        unset($placeholder);
    }
}

就效率而言,您还应该在for循环之外使用foreach或callcount,因为现在您正在调用count-ouch!您可以考虑替换为有什么方法来更新更新中的一个列的旧值吗?例如,如果记录存在,我希望保持create_date值不变。
REPLACE INTO tablename SET field1 = value1, field2 = value2;