MySQL创建含select与delete的存储过程报1064错误如何解决
错误根源
- 缺失分隔符修改逻辑:MySQL默认以
;作为语句终止符,你在创建存储过程前没有修改分隔符,解析器执行到where vehicle_no = vehicleNo;这行末尾的分号时,会直接判定CREATE PROCEDURE语句已经结束,剩余内容不符合语法规则,就会抛出你遇到的1064错误。 - 变量引用不匹配:你通过
select @vid = vehicleID赋值的是全局用户变量@vid,但后续删除booking表时使用的是未定义的局部变量vid,即使语法修复后也无法正常删除对应预约记录。 - 变量赋值写法不规范:MySQL存储过程中给变量赋值推荐使用
SELECT 字段 INTO 变量的标准写法,避免赋值逻辑异常。
修正后可正常运行的代码
-- 先将语句分隔符临时修改为//,避免和存储过程内的分号冲突 DELIMITER // CREATE PROCEDURE `DeleteVehicleWithBookings`(IN vehicleNo VARCHAR(10)) BEGIN -- 声明局部变量存储查询到的车辆ID DECLARE vid INT DEFAULT NULL; -- 按输入的车辆编号查询车辆ID赋值给局部变量 SELECT vehicleID INTO vid FROM vehicle WHERE vehicle_no = vehicleNo; -- 删除对应车辆的预约记录 DELETE FROM booking WHERE vehicleID = vid; -- 删除车辆表对应条目 DELETE FROM vehicle WHERE vehicle_no = vehicleNo; END // -- 语句执行完成后改回默认分隔符; DELIMITER ;
可选优化点
你可以额外加非空判断,避免输入不存在的车辆编号时执行无效的删除操作:
DELIMITER // CREATE PROCEDURE `DeleteVehicleWithBookings`(IN vehicleNo VARCHAR(10)) BEGIN DECLARE vid INT DEFAULT NULL; SELECT vehicleID INTO vid FROM vehicle WHERE vehicle_no = vehicleNo; -- 只有查询到对应车辆才执行删除 IF vid IS NOT NULL THEN DELETE FROM booking WHERE vehicleID = vid; DELETE FROM vehicle WHERE vehicle_no = vehicleNo; END IF; END // DELIMITER ;
内容的提问来源于stack exchange,提问作者Ishini Kiridena
相关产品推荐
相关产品推荐

