Mysql - 确定存储过程中插入行的数量

时间:2014-01-16 20:05:08

标签: mysql sql stored-procedures

所以,基本上我有这个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值会反正增加,我想避免这种情况。

我有什么方法可以完成这项任务吗?

2 个答案:

答案 0 :(得分:1)

答案 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条记录,请计算您的自我,小时(天/月/年)跨越最大值所需的时间。因此,您可以省略浪费的自动递增值。