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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:57:02