我正在使用一个小型网站爬虫程序。我使用 PostgresQL 来存储数据并使用这样的语句来更新它,
INSERT INTO topic (......) VALUES (......)
ON CONFLICT DO UPDATE /* updagte all fields here */
问题是,如果更新之前和更新之后的所有字段真的相等,PostgresQL 真的会更新吗?
最佳答案
Postgres(和几乎所有其他 DBMS 一样)不会检查目标值是否与原始值不同。所以答案是:是的,即使值不同,它也会更新行。
但是,在这种情况下,您可以通过包含一个 where 子句轻松地防止“空”更新:
INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
where 子句将阻止更新与正在插入的行相同的行。为了使其正常工作,您的插入必须列出目标表的所有列。否则,topic is distinct from excluded
条件将始终为真,因为 excluded
行的列数少于 topic
行,因此它是“不同的” "从它。
添加对修改值的检查已在邮件列表中多次讨论并且总是被丢弃。主要原因是,检查每个语句的更改开销只是为了处理一些写得不好的语句是没有意义的。
关于postgresql - 当更新前后字段都相等时,postgres 真的会更新页面文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40819603/