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
であるため、条件は常にtrueになります。 行の列数はtopic
よりも少なくなります 行、したがってそれはそれと「異なる」IDです。
変更された値のチェックを追加することは、メーリングリストで何度も議論されており、常に破棄されています。主な理由は、すべての変更をチェックするオーバーヘッドがあることは意味がないということです。 いくつかのひどく書かれたものに対処するためだけの声明。