MYSQL 过程运行,但返回 0 行受影响

标签 mysql stored-procedures

我调用一个过程,它运行,控制台显示“0 行受影响”。这是 MySQL 过程的正常行为吗?

这些程序显然正在做它们应该做的事情。一个过程有 2 个插入语句,另一个过程有一个插入和更新语句,我亲眼看到了结果。确实有行受到影响。

我不确定稍后是否会使用该结果,但似乎我希望从我的数据库获得准确的响应,无论是否更新了任何内容,尤其是在预期的情况下。

想法?

MySQL 5.5(如果有的话),并且过程使用事务而不是自动提交的语句。

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_issue`(user_id SMALLINT, title varchar(255), body LONGTEXT)
BEGIN
    DECLARE MYUSERID SMALLINT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
START TRANSACTION;
    INSERT INTO tracker.issue (user_id, title, body, creation_date, last_mod_date) values (user_id, title, body, CURDATE(), CURDATE());
    UPDATE user_activity SET last_new_issue = CURDATE(), post_count = post_count + 1 WHERE user_activity.user_id = user_id;
COMMIT;
END

编辑以显示实际查询。我也一直在搜索,据我所知,这是一个已有一年半历史的已知问题。所以我想这个可以关闭。

最佳答案

“0 rows受影响”响应是针对存储过程中执行的最后一条语句的。

通常我通过手动将行数计入 session 变量来跟踪受影响的行数

DELIMITER $$
CREATE  PROCEDURE `create_issue`(user_id SMALLINT, title varchar(255), body LONGTEXT)
BEGIN
    DECLARE MYUSERID SMALLINT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
    SET @inserted_rows = 0;
    SET @updated_rows = 0;
START TRANSACTION;
    INSERT INTO tracker.issue (user_id, title, body, creation_date, last_mod_date) values (user_id, title, body, CURDATE(), CURDATE());
    SET @inserted_rows = ROW_COUNT() + @inserted_rows;
    UPDATE user_activity SET last_new_issue = CURDATE(), post_count = post_count + 1 WHERE user_activity.user_id = user_id;
    SET @updated_rows = ROW_COUNT() + @updated_rows;
COMMIT;
END
$$

执行 SP 后即可读取 session 变量。

我不确定是否可以通过为变量设置值来覆盖 ROW_COUNT() 函数的响应,

关于MYSQL 过程运行,但返回 0 行受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651967/

相关文章:

mysql - mysql 获取具有垂直限制的表数据

php - SQL语法错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 1 行的 'WHERE id = ' 9'' 附近使用的正确语法

mysql - 有没有办法使用 RMySQL 调用存储过程?

sql - 使用 SQL 中的过程从存储表行中删除空间

java - 无法使用 JSP、Glassfish 连接到 mysql 数据库

php - 用于工作日/周末计数的 MySQL/PHP 算法(每月)

php - 为提供的纬度、经度查找最近的司机的程序

sql - PL/SQL 过程字符参数

MySQL复杂的ORDER BY问题

mysql - 操作 '=' 的排序规则 (utf8mb4_general_ci,COERCIBLE) 和 (latin1_swedish_ci,IMPLICIT) 的非法混合