MySQL存储过程使用IF ELSE插入更新查询时报1064语法错误如何解决
MySQL存储过程1064语法错误解决方案
错误根源
你遇到的1064语法错误属于MySQL存储过程编写的典型分隔符冲突问题,和MS SQL的语法习惯差异有关:
- MySQL默认语句结束符为
;,解析器遇到;就会判定当前语句执行完毕 - 存储过程内部的INSERT、UPDATE等语句已经使用了
;作为结束符,导致解析器提前终止对CREATE PROCEDURE完整语句的解析,因此抛出语法错误
修复方案
你只需要在创建存储过程前后临时修改语句结束符,避免和内部语句的结束符冲突即可,修改后的完整可运行代码如下:
-- 临时修改语句结束符为$$,避免和存储过程内部的;冲突 DELIMITER $$ CREATE PROCEDURE SP_AddUpdateUser ( IN InputUsername VARCHAR(512), IN InputPassword VARCHAR(512), IN InputEmail VARCHAR(512) ) BEGIN IF NOT EXISTS(SELECT 1 FROM TB_User WHERE Username = InputUsername) THEN INSERT INTO TB_User(Username, Password, Email, DateCreated) VALUES (InputUsername, InputPassword, InputEmail, NOW()); ELSE UPDATE TB_User SET Password = InputPassword, Email = InputEmail WHERE Username = InputUsername; END IF; END $$ -- 执行完成后改回默认的语句结束符 DELIMITER ;
可选优化
如果你的TB_User表已经为Username字段设置了唯一约束,也可以直接使用MySQL原生的INSERT ... ON DUPLICATE KEY UPDATE语法简化逻辑,无需手动写IF判断,性能也更优:
DELIMITER $$ CREATE PROCEDURE SP_AddUpdateUser ( IN InputUsername VARCHAR(512), IN InputPassword VARCHAR(512), IN InputEmail VARCHAR(512) ) BEGIN INSERT INTO TB_User(Username, Password, Email, DateCreated) VALUES (InputUsername, InputPassword, InputEmail, NOW()) ON DUPLICATE KEY UPDATE Password = VALUES(Password), Email = VALUES(Email); END $$ DELIMITER ;
内容的提问来源于stack exchange,提问作者Lance
相关产品推荐
相关产品推荐

