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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql存储过程或函数中传入参数与表字段名相同引发的悲剧

發布時間:2025/7/25 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql存储过程或函数中传入参数与表字段名相同引发的悲剧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

真實案例。如下的一個存儲過程:

create procedure Apple(in?user_id int)

begin

delete from users?where user_id = user_id;

end

? ? 這個存儲過程中的users表的主鍵名就是user_id ,而該存儲過程的傳入參數也是user_id ,那么該delete語句中的兩個user_id 到底都代表哪一個呢?,mysql的處理是將“where user_id = user_id”中的兩個user_id都當成了users表中的字段來處理,那么該語句就等價于where 1=1,即該語句表達的是刪除users表中的所有數據!!!而這樣寫這個存儲過程的人肯定是是想用傳入的參數user_id來匹配字段中的user_id,所以是在一個語句中最好不要出現表的字段名與傳入參數同名。(上面僅僅是存儲過程的一部分,刪去了其他部分,顯然這是一個事務,肯定得有事務處理,但是此處略了)。

解決辦法有:

(1)杜絕存儲過程或函數的傳入參數同名。比如將上面的傳入參數名稱改為p_user_id就可以了,即delete from users?where user_id = p_user_id;

(2)利用表的別名。比如上面的例子可以改為:delete t from users t where t.user_id = user_id;不過,這里需要注意,在mysql中的delete語句中使用表的別名有些特殊,需要在delete后面加上表的別名。如果像這樣“delete from users t where t.user_id = user_id;”,編譯是通不過的,不信,你試試。

?

轉載于:https://www.cnblogs.com/igoodful/p/8722599.html

總結

以上是生活随笔為你收集整理的mysql存储过程或函数中传入参数与表字段名相同引发的悲剧的全部內容,希望文章能夠幫你解決所遇到的問題。

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