日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【原创】MySQL 返回更新值(RETURNING)

發布時間:2024/4/13 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原创】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 保存刪除。


那這樣的話,我來創建對應的觸發器完成。


DELIMITER?$$ USE?`t_girl`$$ DROP?TRIGGER?/*!50032?IF?EXISTS?*/?`tr_t1_insert_after`$$ CREATE/*!50017?DEFINER?=?'root'@'localhost'?*/TRIGGER?`tr_t1_insert_after`?AFTER?INSERT?ON?`t1`?FOR?EACH?ROW?BEGINREPLACE?INTO?t1_insert?VALUES?(new.id,new.log_time);END; $$ DELIMITER?;


DELIMITER?$$ USE?`t_girl`$$ DROP?TRIGGER?/*!50032?IF?EXISTS?*/?`tr_t1_update_after`$$ CREATE/*!50017?DEFINER?=?'root'@'localhost'?*/TRIGGER?`tr_t1_update_after`?AFTER?UPDATE?ON?`t1`?FOR?EACH?ROW?BEGINREPLACE?INTO?t1_update?VALUES?(new.id,new.log_time);END; $$ DELIMITER?;


DELIMITER?$$ USE?`t_girl`$$ DROP?TRIGGER?/*!50032?IF?EXISTS?*/?`tr_t1_delete_after`$$ CREATE/*!50017?DEFINER?=?'root'@'localhost'?*/TRIGGER?`tr_t1_delete_after`?AFTER?DELETE?ON?`t1`?FOR?EACH?ROW?BEGINREPLACE?INTO?t1_delete?VALUES?(old.id,old.log_time);;END; $$ DELIMITER?;


創建好了以上的表和觸發器后, 拿到返回值就非常容易了, 我直接從以上幾張表來查詢就是。


我現在來演示:

更新:

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)


超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的【原创】MySQL 返回更新值(RETURNING)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。