MySQL事务存储过程报错:WHERE子句列不存在及变量错误
问题解决
错误原因分析
错误1:Error Code: 1054. Unknown column 'productName' in 'where clause'
- 你的存储过程未用
BEGIN...END包裹核心逻辑,导致MySQL仅将SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;视为存储过程的一部分,后续的START TRANSACTION、UPDATE等语句被当作独立SQL执行。此时dataname参数不存在,MySQL解析语句时出现混乱,误报productName不存在。
错误2:Error Code: 1193. Unknown system variable 'data'
- 语句
set data = @data = (...)中的data既不是声明的局部变量,也不是系统变量,MySQL无法识别。你实际需要的是给会话变量@data赋值,无需前缀data =;更推荐使用局部变量,避免污染全局会话环境。
修正后的代码
1. 先创建表(优化结构)
CREATE TABLE CountTable ( id varchar(255) primary key, productName varchar(255) UNIQUE, -- 建议添加唯一约束,确保每个productName对应唯一行 count bigint -- MySQL中用bigint替代long类型 );
2. 创建修正后的存储过程
DELIMITER // -- 修改语句分隔符,避免与存储过程内的分号冲突 CREATE PROCEDURE updateCount(IN dataname VARCHAR(255)) LANGUAGE SQL BEGIN SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; -- 更新指定productName的计数 UPDATE CountTable SET count = count + 1 WHERE productName = dataname; -- 查询并返回更新后的计数 SELECT count AS updated_count FROM CountTable WHERE productName = dataname; COMMIT; END // DELIMITER ; -- 恢复默认分隔符
额外优化建议
- 如果需要处理
productName不存在的场景,可以结合INSERT ... ON DUPLICATE KEY UPDATE逻辑,避免出现更新0行的情况。 - 若需在存储过程内多次使用更新后的计数,可声明局部变量存储结果,示例:
DECLARE new_count bigint; SELECT count INTO new_count FROM CountTable WHERE productName = dataname; SELECT new_count;
内容的提问来源于stack exchange,提问作者BefuddledBarberian
相关产品推荐
相关产品推荐

