所以,基本上我有这个sql存储过程:
drop procedure if exists registrar_cuenta;
delimiter //
create procedure registrar_cuenta (in p_email varchar(255), in p_passwordHash varchar(40), in p_salt varchar(40))
begin
if (exists(select 1 from usuarios where email = p_email and registrado = 0)) then
update usuarios set passwordHash = p_passwordHash, salt = p_salt, fechaRegistro = now(), registrado = 1 where email = p_email and registrado = 0;
else
insert into usuarios (email, passwordHash, salt, fechaRegistro, registrado) values (p_email, p_passwordHash, p_salt, now(), 1);
end if;
end
//
delimiter ;
哪个运行得很好,但我想改变这段代码:
else
insert into usuarios (email, passwordHash, salt, fechaRegistro, registrado) values (p_email, p_passwordHash, p_salt, now(), 1);
end if;
对于这样的事情:
insert into usuarios (email, passwordHash, salt, fechaRegistro, registrado) values (p_email, p_passwordHash, p_salt, now(), 1);
if (inserted_rows == 0) then
alter table usuarios auto_increment = auto_increment - 1;
end if;
问题是我有一个唯一的字段(电子邮件)可能会产生重复的输入错误,如果是这样,那么auto_increment值会反正增加,我想避免这种情况。
我有什么方法可以完成这项任务吗?
答案 0 :(得分:1)
听起来您想使用ROW_COUNT
功能。
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count
答案 1 :(得分:1)
MySQL解决方案 :
您可以使用alter table ...
,如下例所示:
alter table usuarios
auto_increment = ( SELECT ( AUTO_INCREMENT - 1 )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='usuarios' and TABLE_SCHEMA=DATABASE()
);
但是,这种做法是不鼓励的。如果您定义的最大值为int unsigned
的列,则可以存储4294967295
,如果是bigint unsigned
,则最大值为18446744073709551615
。如果数据库引擎每秒可以插入100,000
条记录,请计算您的自我,小时(天/月/年)跨越最大值所需的时间。因此,您可以省略浪费的自动递增值。