为什么逐个运行查询会产生正确的结果,但是在一个块中运行大量的查询并不是吗?

时间:2016-01-18 18:18:16

标签: mysql

我们假设我创建了一个简单的表和一个存储的函数来填充它:

CREATE TABLE t
(
    id INT PRIMARY KEY,
    val VARCHAR(255)
)//

CREATE FUNCTION populateIfNotAlreadyIn (idArg INT, valArg VARCHAR(255))
RETURNS BOOLEAN NOT DETERMINISTIC
BEGIN
    DECLARE alreadyIn INT;
    SELECT COUNT(id) INTO alreadyIn FROM t WHERE id = idArg;
    IF alreadyIn <> 0 THEN
        RETURN FALSE;
    ELSE
        INSERT INTO t (id, val) VALUES (idArg, valArg);
        RETURN TRUE;
    END IF;
END//

当然,预期的行为是,如果表中已存在具有给定ID的行,则函数返回0,如果不存在,则1(在后一种情况下) ,该函数也插入这样的行。)

所以现在进行测试。

如果我在phpmyadmin中逐个运行测试查询:

SELECT populateIfNotAlreadyIn(1, 'val1');

// //转到

SELECT populateIfNotAlreadyIn(2, 'val2');

// //转到

… etc

然后显然,结果是正确的:当且仅当表中没有带有这样的id的行时,函数返回1并插入一行,否则返回0

到目前为止,这么好。但是,不要一个接一个地运行查询,而是让phpmyadmin一次性提供所有这些查询。更具体地说,让我们像这样插入phpmyadmin:

SELECT populateIfNotAlreadyIn(1, 'val1');
SELECT populateIfNotAlreadyIn(2, 'val2');
SELECT populateIfNotAlreadyIn(3, 'val3');
SELECT populateIfNotAlreadyIn(4, 'val4');
SELECT populateIfNotAlreadyIn(5, 'val5');

然后点击Go,运行所有这些。

结果?行正确插入表t。但是存储的函数返回不正确的值。除最后一个之外的每个电话都会返回0

为什么会这样?

0 个答案:

没有答案