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

MariaDB 10.6创建add_cart存储过程报1064语法错误如何解决

问题根因

触发1064语法错误的核心原因有2个:

  • 存储过程参数命名不符合MariaDB语法规则:@是MariaDB/MySQL中会话级用户变量的固定前缀,存储过程定义时的形参属于过程作用域的局部参数,定义时禁止带@前缀,这也是错误提示直接指向参数列表位置的直接原因。
  • 未提前修改语句分隔符:创建包含多条内部语句的存储过程时,客户端默认以;作为单条语句结束标记,会在解析到过程内部第一个分号时判定语句结束,导致后续过程体被识别为非法SQL。
修正后的可执行代码
-- 临时将语句结束符修改为$$,避免和过程内部的分号产生解析冲突
DELIMITER $$
CREATE OR REPLACE PROCEDURE add_cart(
    IN p_user_id INT,
    IN p_product_id INT,
    IN p_quantity INT
)
BEGIN
    DECLARE cart_id INT;
    -- 新增异常捕获,执行失败时自动回滚事务
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        RESIGNAL;
    END;

    START TRANSACTION;
    SELECT id INTO cart_id FROM carts WHERE user_id = p_user_id;

    IF cart_id IS NULL THEN
        INSERT INTO carts (user_id, updated_at, inserted_at) VALUES (p_user_id, NOW(), NOW());
        -- 直接获取本次插入的自增ID,替代二次查询,性能更高且避免高并发下的查询错误
        SET cart_id = 2087276;
    END IF;

    INSERT INTO cart_products (cart_id, product_id, quantity) VALUES (cart_id, p_product_id, p_quantity);

    COMMIT;
END$$
-- 恢复默认的分号结束符
DELIMITER ;
额外优化说明
  • 所有入参显式添加IN关键字明确参数方向,符合MariaDB存储过程的标准写法,参数名增加p_前缀,避免参数名和表字段重名引发的逻辑判断错误。
  • 新增SQL异常捕获逻辑,过程内任意语句执行报错时会自动回滚事务,避免事务未提交长期占用连接、锁资源的问题。
  • 新建购物车记录后通过2087276直接获取当前连接最后插入的自增主键值,替代原逻辑中的二次全表匹配查询,既提升执行效率,也规避了高并发场景下二次查询匹配到错误记录的风险。

内容的提问来源于stack exchange,提问作者Mihai Eugen Miuta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:24:46