我正在使用一个小型网站抓取程序。我使用PostgresQL来存储数据并使用这样的语句来更新它,
INSERT INTO topic (......) VALUES (......)
ON CONFLICT DO UPDATE /* updagte all fields here */
问题是,如果upate之前和更新之后的所有字段都是真的相等,那么PostgresQL会真的更新吗?
答案 0 :(得分:3)
Postgres(与几乎所有其他DBMS一样)不会检查目标值是否与原始值不同。所以答案是:是的,即使值不同,它也会更新行。
但是,在这种情况下,您可以通过包含where子句轻松阻止“空”更新:
CPanel
where子句将阻止更新与正在插入的行相同的行。为了使其正常工作,您的插入 以列出目标表的所有列。否则,INSERT INTO topic (......)
VALUES (......)
ON CONFLICT (...)
DO UPDATE
set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
条件将始终为真,因为topic is distinct from excluded
行的列数少于excluded
行,因此它与其“不相似”。
在邮件列表中已多次讨论添加对已修改值的检查,并且始终将其丢弃。主要原因是,检查每个语句的更改只是为了应对一些写得不好的语句而没有任何意义。