我们假设我创建了一个简单的表和一个存储的函数来填充它:
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
。
为什么会这样?