第一次尝试更新的 INSERT ... ON CONFLICT 等同于什么?

What's the equivalent of INSERT ... ON CONFLICT that first tries update?

我一直在使用 INSERT ... ON CONFLICT DO UPDATE 到 insert/update 数据。我的问题是,我知道大多数时候,我会想要进行更新:每天更新一个计数器。如果该日期没有数据,则创建该行。该创建只会发生一次(很明显),但更新可能每天发生数百万次。使用 INSERT ... ON CONFLICT DO UPDATE 仍然是正确的方法吗?是否有 "try to update first, if that fails then insert the row" 的等价物? (就像实际的 "UPSERT")。

没有 UPDATE 的变体具有相同的行为,原因很简单,它会做与 INSERT ... ON CONFLICT 完全相同的事情。不用担心名字。

如果您每天每行有数百万次更新,您应该更担心 VACUUM

如果可以,不要索引将频繁更新的属性,并创建 fillfactor 低于 100 的 table。您可以获得更高效的 &ldauo;HOT 更新”,这将显着减少磁盘写入量和所需的 VACUUM

确保通过降低 autovacuum_vacuum_cost_delay 来调整 autovacuum 以更具攻击性。