同事们,有一个表,比如说table,它有字段: id- 一个唯一的整数,value1, value2...valueN- 一些值。我使用来自 Python 的 API 请求从第三方服务接收新数据,其中包括id更新的值value。id在新数据中,它们可能包含在id表中的一组中,或者它们可能是新的。数以千计的此类更新记录可以同时到达。问题是如何最有效地替换表中存在的内容并添加不存在的内容。我看到以下选项:
第一个选项
使用 Python,将新的集合分为id表中已存在的和尚不存在的。然后分两个阶段:
阶段1。使用 Python 循环中动态生成的每条记录的更新来向数据库发送垃圾邮件。像这样的东西:
UPDATE table
SET value2=new_value_2, value5=new_value_5
WHERE id = id_from_python;
其中SET和 every中的新值id_from_python将在循环中被 python 替换。
第二阶段。为他们提供INSERT所有新的id数据。
INSERT INTO table (id, value1, value2, value3)
VALUES (new_id, new_val, new_val, new_val),
(new_id, new_val, new_val, new_val);
第二个选择
我在这里读到的。简而言之,我们根据新数据创建一个临时表,并按照上面的链接进行操作,仅分两个阶段 -
阶段1。我们将工作表中的现有值更改为临时表中的值。
UPDATE table b
SET value1 = a.value1,
value2 = a.value2,
value3 = a.value3
FROM temp_table a
WHERE a.id = b.id;
第 2 阶段将临时表中的新表添加id到工作表中。
INSERT INTO table (id, value1, value2, value3)
SELECT id, value1, value2, value3
FROM temp_table
WHERE temp_table.id not in table.id;
混合版本
使用Python,我们分为id新版本和现有版本。从现有的表中,我们创建一个临时表并按照第二个选项中的方式id执行操作,然后将许多新表添加到工作表中,就像第一个选项中一样。UPDATEid
问题。查询写得是否正确?哪个选项更好?有更好/更快/最佳的选择吗?
您可以发出一个请求,让数据库选择是将数据作为新记录插入还是更新记录。最简单的形式有两个选项:
用于版本 9.6+冲突时插入...
用于版本 15+合并到 ... 匹配时 ... 不匹配时