【原创】MySQL 返回更新值(RETURNING)
生活随笔
收集整理的這篇文章主要介紹了
【原创】MySQL 返回更新值(RETURNING)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在寫SQL中,經常會有諸如更新了一行記錄,之后要獲取更新過的這一行。 本身從程序來說,沒啥難度,大不了把這行緩存起來,完了直接訪問。 但是從數據庫的角度出發,怎么能快速的拿出來,而又不對原表進行二次掃描? 比如其他數據庫提供了如下的語法來實現:
返回更新掉的行:
t_girl=#?update?t1?set?log_time?=?now()?where?id?in?(1,2,3)?returning?*;id?|??????????log_time?????????? ----+----------------------------1?|?2014-11-26?11:06:53.5552172?|?2014-11-26?11:06:53.5552173?|?2014-11-26?11:06:53.555217 (3?rows) UPDATE?3 Time:?6.991?ms返回刪除掉的行:
t_girl=#?delete?from?t1?where?id?<?2?returning?*;id?|??????????log_time?????????? ----+----------------------------1?|?2014-11-26?11:06:53.555217 (1?row) DELETE?1 Time:?6.042?ms返回插入后的行:
t_girl=#?insert?into?t1?select?1,now()?returning?*;id?|??????????log_time?????????? ----+----------------------------1?|?2014-11-26?11:07:40.431766 (1?row) INSERT?0?1 Time:?6.107?ms t_girl=#那在MySQL里如何實現呢??
我可以創建幾張內存表來來保存這些返回值,如下:
CREATE?TABLE?t1_insert?ENGINE?MEMORY?SELECT?*?FROM??t1?WHERE?FALSE; CREATE?TABLE?t1_update?ENGINE?MEMORY?SELECT?*?FROM??t1?WHERE?FALSE; CREATE?TABLE?t1_delete?ENGINE?MEMORY?SELECT?*?FROM??t1?WHERE?FALSE; ALTER?TABLE?t1_insert?ADD?PRIMARY?KEY?(id); ALTER?TABLE?t1_update?ADD?PRIMARY?KEY?(id); ALTER?TABLE?t1_delete?ADD?PRIMARY?KEY?(id);以上建立了三張表來存放對應的操作。 t1_insert 保存插入;t1_update 保存更新;t1_delete 保存刪除。
那這樣的話,我來創建對應的觸發器完成。
創建好了以上的表和觸發器后, 拿到返回值就非常容易了, 我直接從以上幾張表來查詢就是。
我現在來演示:
更新:
mysql>?truncate?table?t1_update; Query?OK,?0?rows?affected?(0.00?sec) mysql>?UPDATE?t1?SET?log_time?=?NOW()?WHERE?id?<?15; Query?OK,?3?rows?affected?(0.01?sec) Rows?matched:?3??Changed:?3??Warnings:?0獲取更新記錄:
mysql>?select?*?from?t1_update; +----+----------------------------+ |?id?|?log_time???????????????????| +----+----------------------------+ |?12?|?2014-11-26?13:38:06.000000?| |?13?|?2014-11-26?13:38:06.000000?| |?14?|?2014-11-26?13:38:06.000000?| +----+----------------------------+ 3?rows?in?set?(0.00?sec)插入:
mysql>?truncate?table?t1_insert; Query?OK,?0?rows?affected?(0.00?sec) mysql>?INSERT?INTO?t1?VALUES?(1,NOW()); Query?OK,?1?row?affected?(0.08?sec)獲取插入記錄:
mysql>?select?*?from?t1_insert; +----+----------------------------+ |?id?|?log_time???????????????????| +----+----------------------------+ |??1?|?2014-11-26?13:38:06.000000?| +----+----------------------------+ 1?row?in?set?(0.00?sec)刪除:
mysql>?truncate?table?t1_delete; Query?OK,?0?rows?affected?(0.00?sec) mysql>?DELETE?FROM?t1?WHERE?id?<?15; Query?OK,?4?rows?affected?(0.01?sec)獲取刪除記錄:
mysql>?select?*?from?t1_delete; +----+----------------------------+ |?id?|?log_time???????????????????| +----+----------------------------+ |??1?|?2014-11-26?13:38:06.000000?| |?12?|?2014-11-26?13:38:06.000000?| |?13?|?2014-11-26?13:38:06.000000?| |?14?|?2014-11-26?13:38:06.000000?| +----+----------------------------+ 4?rows?in?set?(0.00?sec)總結
以上是生活随笔為你收集整理的【原创】MySQL 返回更新值(RETURNING)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码需要不断进化和改变
- 下一篇: 使用GoldenGate进行平台迁移和数