2011-12-06 45 views
0

我有這個存儲過程:選擇....到錯誤的MySQL

delimiter/
drop procedure if exists registration/create procedure registration(email varchar(50), pass varchar(50), first_name varchar(30), last varchar(30), address varchar(100), city varchar(30), state_id int, zip varchar(20), phone varchar(15), alt_phone varchar(15), outlet varchar(100), url varchar(255), bio text, out response int, out photo_location varchar(40), image_type varchar(10), out emailer varchar(20), out max_row int) 
start_:begin 
start transaction; 
insert into registration_application values(null, email, PASSWORD(pass), first_name, last, address, city, state_id, zip, phone, alt_phone, outlet, url, bio); 
set emailer=email; 
select id into max_row from registration_application where email=email order by id; 
commit; 
set response= 1; 
end start_; 

id是主鍵,這是auto_incremented和電子郵件領域具有獨特的索引;所以,2行不可能包含相同的電子郵件;然而,無論何時,當我調用該過程時,「select ... into」總是返回多於一行,即使該電子郵件地址只存在一行。 據我所知,我可以通過使用限制1來限制它返回只有一行,'使用ID按順序desc';然而,我的問題是這些:

  • 問題是在MySQL中的錯誤?我看到很多人在網上遇到類似的問題。
  • 因爲我不知道什麼位置我正在尋找的id(因爲select..into顯然返回多個行),有沒有辦法確保正確的id總是會被返回? 謝謝。
+1

你'這裏電子郵件= email'這幾乎總是如此。難怪你選擇了很多(意思是ALL)行。 –

+1

我想這個問題來自於爲表格列和過程參數使用相同的名稱('email')。 –

回答

1

@ user705339如上所述,LAST_INSERT_ID()在某些情況下可能不會返回所需的ID,例如,如果嘗試插入重複的電子郵件,插入語句返回錯誤,並且LAST_INSERT_ID()的值未定義。

您的問題是對電子郵件的模糊引用,where email=email始終爲真,返回表registration_application中的所有行。而不是預期的單排。

你可以做什麼,因爲你設置emailer=email是:

select id into max_row from registration_application where email=emailer order by id; 
1

LAST_INSERT_ID()函數是獲取最後一個自動增量值的正確方法。

+0

雖然技術上正確,但在這種情況下,您的答案將無法正常工作,因爲代碼不會始終設置爲選擇插入的最後一個ID;它設置爲根據給定的email參數選擇一個id。儘管如此,感謝您的回覆。 –

+0

@ user705339:但是這是你剛插入的電子郵件,對嗎? –

+0

是的,但下一次,我需要的電子郵件可能與我剛剛插入的電子郵件不同。該代碼只是程序如何構建的一個例子;這就是爲什麼獲取最後一個插入ID並不總是正確的方式 –