当字段在更新之前和之后都等于时,postgres会真正更新页面文件吗?

时间:2016-11-26 14:53:12

标签: postgresql

我正在使用一个小型网站抓取程序。我使用PostgresQL来存储数据并使用这样的语句来更新它,

INSERT INTO topic (......) VALUES (......)
ON CONFLICT DO UPDATE /* updagte all fields here */

问题是,如果upate之前和更新之后的所有字段都是真的相等,那么PostgresQL会真的更新吗?

1 个答案:

答案 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行,因此它与其“不相似”。

在邮件列表中已多次讨论添加对已修改值的检查,并且始终将其丢弃。主要原因是,检查每个语句的更改只是为了应对一些写得不好的语句而没有任何意义。