类似的线程已经在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);
}
}
答案 0 :(得分:2)
REPLACE INTO tablename SET field1 = value1, field2 = value2;