真實案例。如下的一個存儲過程:
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;”,編譯是通不過的,不信,你試試。