2016-11-26 31 views
0

我正在使用一個小網站爬蟲程序。我使用PostgreSQL來存儲數據,並使用這樣的語句來更新,將postgres真正更新頁面文件時,字段都等於更新前後?

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

的問題是,如果upate前和更新後的所有字段是真正平等相待,就真的PostgreSQL的更新?

+0

可能重複的[Postgres:更新未更改的行](http://stackoverflow.com/questions/6985279/postgres-updating-not-changed-rows) –

+0

flaged as duplicate to http://stackoverflow.com /問題/ 6985279/Postgres的 - 更新 - 不改變排上。我得到了我的答案,謝謝。 –

回答

3

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行,因此它與其「不同」。


在郵件列表中多次討論添加對修改值的檢查,並始終放棄。主要原因是,爲了處理一些寫得不好的問題,檢查每個聲明的變化是沒有意義的。