我在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 ;
起初,它创build存储过程时显示错误1064。 我添加了分隔符部分,当我尝试从phpmyadmin运行查询时,Firefox进入无响应状态。 之后,我启动了Internet Explorer,并试图打开我的网页使用相同的数据库,它工作正常。 但是,我试图打开phpmyadmin和IE进入没有响应的状态。 我重新启动了两台服务器。 稍后重新启动PC。 再次尝试,但同样的行为。
那么这个小小的代码怎么了? 我是否错过了可能导致无限循环的事情?
谢谢
根据我的经验,phpmyadmin不喜欢在SQL查询窗口内使用delimiter // 。 相反,在phpmyadmin SQL查询窗口中有一个“定界符”文本框,其内容设置为“;” 默认。 在这个文本框中input“//”而不是“;”,然后用delimiter //和delimiter ;尝试查询delimiter ; 省略线。
订单不正确。 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 ;
你应该确保以下quiz_users
forum_id被编入索引 points 没有索引 (没错,我说没有索引,因为值会增加,并导致该列索引的BTREE洗牌索引中的关键位置)。 如果PHP脚本正在迭代parentid和userid值,大OUCH!
这将表明浏览器会话正在进行往返行程,以便将每个调用提供给存储过程。 您应该考虑将所有parentid和userid组合传递到表中,并让存储过程在服务器端处理它,并在浏览器会话中进行往返。