存储过程插入两次MYSQL

时间:2017-03-31 07:36:45

标签: mysql stored-procedures

我在MySQL中有这个存储过程:

CREATE PROCEDURE c_ranges(
    _nombre VARCHAR(100),
    _limiteinferior DECIMAL(10,2),
    _limitesuperior DECIMAL(10,2)
)
BEGIN
    DECLARE _newID INT;
    SELECT MAX(idrango)+1 FROM rango INTO _newID;
    IF (_newID IS NULL) THEN
        SET _newID = 0;
    END IF;
    INSERT INTO rango (idrango,nombre,limiteinferior,limitesuperior)
    VALUES(_newID,_nombre,_limiteinferior,_limitesuperior);
    SELECT idrango FROM rango WHERE idrango=_newID;
END //

当我像这样运行时:

CALL c_ranges("My range",0,10.3)

它插入相同的记录两次,但第二次的id增加了一个。

使用存储过程多次尝试插入后,这是表的内容。

首次尝试:call c_Ranges("first range",0,0)

第二次尝试:call c_Ranges("second range",0,0)

第三次尝试:call c_Ranges("third range",0,0)

enter image description here

我真的很不安,有人能告诉我可能会发生什么吗?

2 个答案:

答案 0 :(得分:0)

我最近面对这种情况。我发生的事情是,由于我自己的逻辑,我代码上调用存储过程的方法执行了两次。我知道,这很愚蠢,但是确实如此!
我的验证会评估存储过程响应的结果,并据此管理检索空JSON或响应的JSON的流程。我的错误是两次运行该方法,而不是存储响应,然后运行了验证。就像这样...

我做错了...

return (string.IsNullOrEmpty(data.callProcedure("copyData")) ? "{}" : data.callProcedure("copyData"));

我应该做的!

string response = data.callProcedure("copyData");
return (string.IsNullOrEmpty(response) ? "{}" : response));

希望有帮助!

答案 1 :(得分:0)

原因:phpMyAdmin问题

正如@ ZamronyP.Juhara在a comment to the question中指出的,这可能发生……

在PhpMyAdmin的SQL命令输入中运行CALL aStoredProc()时。它两次调用它们,导致创建两个记录。如果从PhpMyAdmin-> Database-> Routine-> Execute或从MySQL命令行执行,则不会发生此问题。

在通过phpMyAdmin 4.0.4.2测试存储过程时,我刚遇到此行为。