观察#1

观察#1

我使用的是 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 脚本正在迭代parentiduserid赋值,那么 BIG OUCH !!!

这表明浏览器会话正在进行往返以将每个调用提供给存储过程。您应该考虑将所有parentiduserid组合传递到一个表中,并让存储过程在服务器端处理它,并从浏览器会话进行往返。

相关内容