You need to enable JavaScript to run this app. MySQL存储过程使用IF ELSE插入更新查询时报1064语法错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:33:02