【问题标题】:Why MySQL (MariaDB) update transaction returns '0 row affected'?为什么 MySQL (MariaDB) 更新事务返回“0 行受影响”?
【发布时间】:2016-01-19 21:44:32
【问题描述】:
  • 大家好。

我对 MySQL 有点奇怪。 (哦,首先,对不起我的英语不好。)

我已经制作了简单的表格和存储过程。表定义是...

CREATE TABLE numTable (
    firstNum INT,
    secondNum INT
);
INSERT INTO numTable (firstNum, secondNum) VALUES (1, 2);

SP 是……

DELIMITER ;;

CREATE PROCEDURE updateNum (
    IN num1 INT,
    IN num2 INT
)

BEGIN

START TRANSACTION;

    UPDATE  numTable
    SET     firstNum = num1, secondNum = num2;

COMMIT;

END ;;

DELIMITER ;

然后我就这样执行了 SP...

CALL updateNum (3, 4);

然后 MySQL 返回 ...

0 行受影响

当我看到这个结果时,我想“有语法错误吗?”但不是。 UPDATE 查询工作正常。 numTable 的数据从 (1, 2) 变为 (3, 4)。

我也发现了这个。我删除了“开始交易;”和“提交”声明。并再次执行 updateNum SP。结果是……

1 行受影响

这一次,UPDATE 查询也运行良好。 numTable 的数据已成功更改。

为什么会出现这种差异?有没有办法使用 TRANSACTION 语句获得正确的受影响行?

我在 MySQL 5.6.27、MariaDB 10.0.21 和 MariaDB 10.1.8 上对此进行了测试,结果与上述相同。

感谢您阅读我的问题。

【问题讨论】:

    标签: mysql transactions mariadb


    【解决方案1】:

    类似于@Leow's,但我发现如果没有事务,并且没有在更新后立即发生,一切都会丢失。所以:

    START TRANSACTION;
    update ...
    select row_count() into @theCount; -- saved for posterity, perhaps for use at end
    COMMIT;
    select @theCount;
    

    【讨论】:

    • 这是你执行的最后一个命令抛出 0。提交
    【解决方案2】:

    您将使用

    获得受影响的行
    ROW_COUNT()
    

    所以,选择 ROW_COUNT() 最后

    【讨论】:

    • 谢谢你,刘嘉敏。你的回答很有帮助。但我想知道为什么会发生这种差异。你能教我吗?
    • 我必须承认我不是最好的理论老师。但是,我可以说,作为 COMMIT 命令的输出,您将受到 0 行的影响,这是您存储过程的最后一条消息,它不是您想要的信息。你想知道的是中间发生了什么。
    猜你喜欢
    • 2021-05-06
    • 2017-05-06
    • 2022-01-27
    • 1970-01-01
    • 2016-09-24
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多