You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8导入存储过程遇1064语法错误,求解决方法

解决MySQL 8存储过程导入的1064语法错误

问题根源

你遇到的错误主要来自两个核心问题:

  1. 语句分隔符冲突:MySQL默认以;作为SQL语句的结束标记,而存储过程体内部包含多个;,导致MySQL提前终止存储过程的创建逻辑,引发语法错误。
  2. 保留字转义配合问题:groups是MySQL的保留字,必须用反引号`包裹才能作为表名使用,你之前单独尝试转义但未配合分隔符修改,导致问题未彻底解决。

修正后的完整代码

执行以下完整语句来创建存储过程:

DELIMITER //

CREATE PROCEDURE `getTestById`(IN `studID` INT, IN `tID` INT)
BEGIN
     SELECT 
          t.id,
          t.name,
          c.name category,
          i.name instructor,
          getQuestionsInTest(t.id) questions,
          ts.startTime,
          ts.duration,
          ts.passPercent,
          ts.endTime,
          ts.id settingID,
          ts.random 
     FROM `groups` g
     INNER JOIN groups_has_students gs 
          ON gs.studentID = studID AND g.id = gs.groupID
     INNER JOIN test t 
          ON t.id = g.assignedTest
     INNER JOIN test_settings ts 
          ON ts.id = g.settingID
     INNER JOIN category c 
          ON c.id = t.categoryID
     INNER JOIN instructor i 
          ON i.id = t.instructorID
     WHERE 
          (CONVERT_TZ(NOW(), @@session.time_zone, '+02:00') BETWEEN ts.startTime AND ts.endTime)
          AND t.id NOT IN (SELECT testID FROM result WHERE studentID = gs.studentID)
          AND t.id = tID;
END //

DELIMITER ;

关键说明

  • 临时修改分隔符:先执行DELIMITER //将语句结束符改为//,这样MySQL会把存储过程内部的所有;视为过程代码的一部分,直到遇到//才结束整个存储过程的创建。完成后执行DELIMITER ;恢复默认分隔符。
  • 保留字强制转义:确保groups表名被`groups`包裹,彻底避免与MySQL保留字的冲突。
  • 额外验证:确认getQuestionsInTest函数已存在且能正常调用,否则会引发新的执行错误。

内容的提问来源于stack exchange,提问作者candycrush007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:11