我使用的是 Windows 7 旗舰版 32 位 + xampp 1.7.2 [MySQL v5.1.37]
这是我的存储过程:
delimiter //
CREATE PROCEDURE updatePoints(IN parentid INT(5),IN userid INT(5))
DECLARE chpoints INT(5);
BEGIN
SELECT points INTO chpoints FROM quiz_challenges WHERE id = parentid;
UPDATE quiz_users SET points = points + chpoints WHERE forumid=userid;
END;
//
delimiter ;
起初,创建存储过程时显示错误 1064。我添加了分隔符部分,当我尝试从 phpmyadmin 运行查询时,Firefox 进入无响应状态。之后,我启动 Internet Explorer 并尝试打开使用相同数据库的页面,它运行正常。但是,我尝试打开 phpmyadmin,IE 也进入无响应状态。我重新启动了两个服务器。后来重新启动了 PC。再次尝试,但行为相同。
那么这段小小的代码有什么问题?我是否遗漏了可能导致无限循环的某些内容?
谢谢
答案1
根据我的经验,phpmyadmin 不喜欢在 SQL 查询窗口中使用。相反,phpmyadmin SQL 查询窗口中有一个“分隔符”文本框,其内容默认设置为“;”。在此文本框中输入“//”而不是“;”,然后尝试省略和行delimiter //
进行查询。delimiter //
delimiter ;
答案2
观察#1
顺序不正确。 应该DECLARE chpoint INT(5)
在 之后BEGIN
,而不是 之前
delimiter //
CREATE PROCEDURE updatePoints(IN parentid INT(5),IN userid INT(5))
BEGIN
DECLARE chpoints INT(5);
SELECT points INTO chpoints FROM quiz_challenges WHERE id = parentid;
UPDATE quiz_users SET points = points + chpoints WHERE forumid=userid;
END;
//
delimiter ;
观察#2
您应该确保以下事项quiz_users
forum_id
已编入索引points
未被索引(没错,我说没有索引,因为值会增加,并导致该列索引的 BTREE 打乱该键在索引中的位置)。
观察#3
如果 PHP 脚本正在迭代parentid
和userid
赋值,那么 BIG OUCH !!!
这表明浏览器会话正在进行往返以将每个调用提供给存储过程。您应该考虑将所有parentid
和userid
组合传递到一个表中,并让存储过程在服务器端处理它,并从浏览器会话进行往返。