MySQL存储过程CREATE错误

时间:2011-06-15 02:22:29

标签: mysql stored-procedures

我有大约2年的mySQL,但我第一次潜入存储过程为我的网站创建一个内部分析工具。我通常擅长追踪SQL错误,但这个问题让我不知所措。

我得到的错误是:

  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第3行的''附近使用正确的语法

这是我执行以接收此错误的代码:

CREATE PROCEDURE STORE_ANALYTICS (IN chain VARCHAR(300))
BEGIN
    UPDATE _analytics_clicks 
    SET chainCount = (chainCount + 1) 
    WHERE visitChain = chain;

    IF SELECT ROW_COUNT() = 0 THEN
        INSERT INTO _analytics_clicks (visitChain, chainCount) 
        VALUES (chain, 1);
    END IF;
END|

值得注意的是,在执行此操作之前,我执行了

DELIMITER |

我想改变的表的结构是这样的:

chainID int(11)        auto_increment
visitChain  varchar(300)    
chainCount  int(11)     

当我自己执行第3行时,用visitChain ='0'替换visitChain = chain(0是我测试的链),命令运行正常,并且chainCount递增。

关于我为什么会收到此错误/存储过程的任何想法都没有创建?

谢谢, 马特

编辑:

SQL命令中包含的分隔符:

DELIMITER |
CREATE PROCEDURE STORE_ANALYTICS (IN chain VARCHAR(300))
BEGIN
UPDATE _analytics_clicks SET chainCount = (chainCount+1) WHERE visitChain=chain;
IF ROW_COUNT() = 0 THEN
INSERT INTO _analytics_clicks (visitChain, chainCount) VALUES (chain, 1);
END IF;
END|
DELIMITER ;

给我这个错误:     致命错误:第119行的C:\ wamp \ apps \ phpmyadmin3.2.0.1 \ libraries \ import \ sql.php超出了300秒的最长执行时间

2 个答案:

答案 0 :(得分:0)

你可以做到

IF ROW_COUNT() = 0 THEN

而不是IF SELECT ROW_COUNT() = 0 THEN。无需SELECT

答案 1 :(得分:0)

我怀疑你的分隔符设置不正确。

我通常在我的SQL源中包含分隔符set / unset语句,这就是“它只是运行” - 每个SQL文件都可以独立运行,这是很好的做法,例如:

delimiter ~

create procedure ...

end;~

delimiter ;

尝试将分隔符更改为比管道字符更致命的东西 - 尝试我的tilda ~字符,这从来没有给我带来任何麻烦。我也经常看到$$使用过。