天天看點

PostgreSQL 如何實作upsert與新舊資料自動分離

很多業務也行有這樣的需求,新的資料會不斷的插入,并且可能會有更新。

對于更新的資料,需要記錄更新前的記錄到曆史表。

PostgreSQL 如何實作upsert與新舊資料自動分離

這個需求有點類似于審計需求,即需要對記錄變更前後做審計。

我以前有寫過使用hstore和觸發器來滿足審計需求的文檔,有興趣的同學可以參考

<a href="http://blog.163.com/digoal@126/blog/static/163877040201252575529358/">http://blog.163.com/digoal@126/blog/static/163877040201252575529358/</a>

本文的目的并不是審計,而且也可能不期望使用觸發器。

還有什麼方法呢?

postgresql 這麼高大上,當然有,而且還能在一句sql裡面完成,看法寶。

建立一張目前狀态表,一張曆史記錄表。

插入一條不存在的記錄,不會觸發插入曆史表的行為。

注意替代變量

插入一條已存在的記錄,并且有資料的變更,觸發資料插入曆史表的行為。

插入一條已存在的記錄,并且已存在的記錄值和老值一樣,不會觸發将資料插入曆史表的行為。

執行計劃

在不支援insert on conflict文法的postgresql中(小于9.5的版本),sql可以調整為:

小于9.5的版本,實作本文的場景,需要這樣寫。

繼續閱讀