我有大约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秒的最长执行时间
答案 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 ~
字符,这从来没有给我带来任何麻烦。我也经常看到$$
使用过。