我调用一个程序,它运行,控制台说“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 :(得分:1)
“0行受影响”响应是针对存储过程中执行的最后一个语句。
通常我会通过手动将它们计入会话变量来跟踪影响的行数
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后读取会话变量。
我不确定是否可以通过将值设置为变量来覆盖ROW_COUNT()函数的响应,
答案 1 :(得分:0)
肯定是不对的。如果发生多个插入,则sproc仍应返回受影响的行数。我正在使用相同版本的MySQL,这对我来说很好。
答案 2 :(得分:0)
我猜这是一个报道的错误。对于MySQL邮件列表/论坛来说可能是一个很好的问题。 http://bugs.mysql.com/bug.php?id=44854
答案 3 :(得分:0)
你确定你没有做那样的事吗
...SET col1='value1' AND col2='value2'...
而不是
...SET COL1='value1', col2='value2'...
您可以发布存储过程吗?