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
相关产品推荐
相关产品推荐

