天天看點

PostgreSQL 在對賬|購票|防纂改|原子操作中的文法妙用

postgresql , update , returning , new , old

在資料庫中更新記錄時,有時為了對賬,或者防纂改的目的,需要在更新後立即傳回更新前和更新後的值。

例如以set bit為例,假設使用bit串作為火車的每個位置,每個bit代表一張票,0表示未售賣,1表示已售賣。

購票時,使用set bit=1的操作,為了確定不出現重複售票的問題,必須確定被set的value以前的值為0,set後的值為1。

這個動作其實也可以在function中來保證,不過你要擴充function的功能,在function中確定set bit前的值為0,set bit後的值為1。

本文要講的是通過update returning文法來實作類似的對照功能。

其實insert returning也有類似的用法,例如插入時并不知道資料庫生成了什麼uuid,這個uuid可能是流水号,将來程式要用來做二次确認的搜尋。(如營運商的二次确認,或者短信密碼,也需要用來作為辨別)

目前postgresql支援insert,delete,update的returning。

insert returning 傳回的是新插入的值。

delete returning 傳回的是被删除的值。

update returning 傳回的是更新後的值,不能傳回更新前的值,但是有方法可以得到。

或者等阿裡雲rds postgresql退出update returning old.column的功能吧。

例子

postgresql 支援delete, update傳回删除前的值以及更新後的值.

update returning 傳回的是更新後的值.

delete returning 傳回的是删除前的值.

returning 後的子句類似select ... from 中的子句, 是以也支援表達式 :

使用這種方法可以傳回set_bit前的bit string以及set_bit後的bit string。

使用這種方法也可以傳回set_bit前的bit string以及set_bit後的bit string。

繼續閱讀