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

标签 postgresql

我正在使用一个小型网站爬虫程序。我使用 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/

相关文章:

sql - 'union' 处或附近的 PostgreSQL 语法错误

django - 在 django 中运行syncdb时找不到关系

postgresql:枚举和字符变化,更新

postgresql - 将表格中的两行合并为一行

java - 使用 JDBC 将值插入到 postgresql

mysql - 将一个表的主 ID 插入到另一个表中

SQL 按记录数过滤

postgresql - 当 n<2 时,postgres STDDEV 聚合行为

sql - 基于计数分组的 Active Record 对象

ruby-on-rails - 为什么 Postgres DUMP 数据数据库连接在 Amazon RDS 上丢失?