选择....进入错误mysql

时间:2011-12-06 19:55:06

标签: 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行,即使该行电子邮件地址只存在行。  我明白我可以通过使用限制1和'使用id desc'命令来限制它只返回一行;但是,我的问题是:

  • 问题是mysql中的错误吗?我见过很多网上有类似问题的人。
  • 由于我不知道我正在寻找的id是什么位置(因为select..into显然返回了多行),有没有办法确保始终返回正确的id? 谢谢。

2 个答案:

答案 0 :(得分:1)

LAST_INSERT_ID()函数是获取最后一个自动增量值的正确方法。

答案 1 :(得分:1)

如上所述

@ user705339 LAST_INSERT_ID()在某些情况下可能不会返回所需的id,例如,如果您尝试插入重复的电子邮件,则insert语句将返回错误,并且LAST_INSERT_ID()的值未定义。 / p>

您的问题是对电子邮件的模糊引用,where email=email始终为true,返回表registration_application中的所有行。而不是预期的单行。

由于您正在设置emailer=email,您可以执行的操作是:

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