如果不存在其他更新,则插入的最有效方式

时间:2014-11-12 18:27:39

标签: php mysql pdo

类似的线程已经在stackoverflow.com上了,但是没有一个解释了如果表中不存在INSERT的最有效方法是什么,如果它存在则更新,并且让我们假设我们想要一次又一次地用数千条记录做到这一点。

有一个表库存,用于存储ID,sku,仓库,数量

我与一些API沟通以获取所有库存的清单(让我们在亚马逊中说),我想将它与我的系统同步,所以我总是知道我在哪个仓库中有多少数量。当然,在某些情况下,对于新的skus,将其保存在数据库中的查询将是一个插入查询,但对于那些旧的,它将是一个更新。当我们必须同步数千条记录时,执行此操作的最有效方法是什么?还有一件事是,sku,warehouseid的组合必须是唯一的,所以当我们执行更新时,我们需要首先检查该组合是否存在,如果它确实存在,我们必须使用插入。

请记住,为了插入记录,我使用多个插入PDO(一次插入1000个),因此我可以在1-2秒内技术上执行1000次插入。

我正在考虑从Inventory表中提取所有记录并将它们保存在数组中。然后从API调用中提取所有记录并在代码中进行比较。这样我就可以指定例如5000条记录需要更新而10000条需要插入。你觉得怎么样?它会比先执行SELECT然后INSERT或UPDATE快吗?还有什么方法可以使用与我插入记录类似的一个查询执行多个UPDATES?

这是我的多重插入功能:

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);
    }
}

1 个答案:

答案 0 :(得分:2)

REPLACE INTO tablename SET field1 = value1, field2 = value2;

http://dev.mysql.com/doc/refman/5.0/en/replace.html