Postgresql 当更新前后字段都相等时,postgres真的会更新页面文件吗?

Postgresql 当更新前后字段都相等时,postgres真的会更新页面文件吗?,postgresql,Postgresql,我正在使用一个小的网站爬虫程序。我使用PostgresQL存储数据,并使用这样的语句更新数据 INSERT INTO topic (......) VALUES (......) ON CONFLICT DO UPDATE /* updagte all fields here */ 问题是,如果upate之前和更新之后的所有字段都相等,PostgresQL真的会更新吗?Postgres(与几乎所有其他DBMS一样)不会检查目标值是否与原始值不同。所以答案是:是的,即使值不同,它也会更新行 但是

我正在使用一个小的网站爬虫程序。我使用PostgresQL存储数据,并使用这样的语句更新数据

INSERT INTO topic (......) VALUES (......)
ON CONFLICT DO UPDATE /* updagte all fields here */
问题是,如果upate之前和更新之后的所有字段都相等,PostgresQL真的会更新吗?

Postgres(与几乎所有其他DBMS一样)不会检查目标值是否与原始值不同。所以答案是:是的,即使值不同,它也会更新行

但是,在这种情况下,您可以通过包含where子句轻松防止“空”更新:

INSERT INTO topic (......) 
VALUES (......)
ON CONFLICT (...) 
DO UPDATE 
    set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
where子句将阻止更新与插入的行相同的行。要使其正常工作,insert必须列出目标表的所有列。否则,
主题不同于排除的
条件将始终为真,因为
排除的
行的列数少于
主题
行,因此其id与之“不同”


邮件列表中多次讨论了添加修改值检查,但始终被放弃。主要原因是,仅仅为了处理一些写得不好的语句而检查每个语句的更改是没有意义的。

Postgres(与几乎所有其他DBMS一样)不会检查目标值是否与原始值不同。所以答案是:是的,即使值不同,它也会更新行

但是,在这种情况下,您可以通过包含where子句轻松防止“空”更新:

INSERT INTO topic (......) 
VALUES (......)
ON CONFLICT (...) 
DO UPDATE 
    set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;
where子句将阻止更新与插入的行相同的行。要使其正常工作,insert必须列出目标表的所有列。否则,
主题不同于排除的
条件将始终为真,因为
排除的
行的列数少于
主题
行,因此其id与之“不同”


邮件列表中多次讨论了添加修改值检查,但始终被放弃。主要原因是,仅仅为了应付一些写得不好的语句而检查每个语句的更改是没有意义的。

可能重复的flagged as duplicate to。我得到了我的答案,谢谢。可能的复制被鞭打为复制到。我得到了答案,谢谢。