2016-11-26 4 views
0

私は少しのウェブサイトのクローラプログラムで作業しています。私は実際に等しいあるすべてのフィールドupate更新前と更新後、PostgreSQLは本当にを更新してしまう場合postgresは、更新前後のフィールドがすべて等しい場合、実際にページファイルを更新しますか?

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

質問は、データを格納し、それを更新するために、このようなステートメントを使用するためにはPostgreSQLを使うのか?

+0

[Postgres:変更されていない行を更新する](http://stackoverflow.com/questions/6985279/postgres-updating-not-changed-rows)の可能な複製 –

+0

重複してhttp://stackoverflow.com/questions/6985279/postgres-updating-not-changed-rows。私は私の答えを、ありがとう。 –

答えて

3

Postgres(ほぼすべての他のDBMSと同様)は、目標値が元の値と異なるかどうかをチェックしません。つまり、答えは:はい、値が異なっていても行を更新します。

しかし、簡単に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の行はtopicの行よりも少ない列を持ち、したがってその行のidと「別個」であるからです。変更された値のチェックを追加


はメーリングリストで複数回議論されていると、常に廃棄されています。その主な理由は、の変更点を確認するオーバーヘッドがあると意味がなく、ちょうどいくつかのひどく書かれたものに対処するにはすべての声明です。

関連する問題