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;”,編譯是通不過的,不信,你試試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM