为什么 MySQL (MariaDB) 更新事务 returns '0 行受影响'?
Why MySQL (MariaDB) update transaction returns '0 row affected'?
- 大家好。
我对 MySQL 有一些奇怪的看法。
(哦,首先,抱歉我的英语不好。)
我制作了简单的 table 和存储过程。 Table 定义是...
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 returns ...
0 row(s) affected
当我看到这个结果时,我想 'Is there any syntax error?' 但是,不是。更新查询工作正常。 numTable 的数据从 (1, 2) 变为 (3, 4)。
我也发现了这个。我删除了 'START TRANSACTION;' 和 'COMMIT' 语句。并再次执行 updateNum SP。结果是...
1 row(s) affected
这一次,UPDATE 查询也运行良好。 numTable 的数据已成功更改。
为什么会出现这种差异?有没有一种方法可以使用 TRANSACTION 语句获得正确的受影响行?
我在 MySQL 5.6.27、MariaDB 10.0.21 和 MariaDB 10.1.8 上进行了测试,结果与上面相同。
感谢您阅读我的问题。
您将使用
获得受影响的行
ROW_COUNT()
所以,SELECT ROW_COUNT()
最后
与@Leow 类似,但我发现如果没有交易,并且没有在更新后立即发生,一切都会丢失。所以:
START TRANSACTION;
update ...
select row_count() into @theCount; -- saved for posterity, perhaps for use at end
COMMIT;
select @theCount;
- 大家好。
我对 MySQL 有一些奇怪的看法。 (哦,首先,抱歉我的英语不好。)
我制作了简单的 table 和存储过程。 Table 定义是...
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 returns ...
0 row(s) affected
当我看到这个结果时,我想 'Is there any syntax error?' 但是,不是。更新查询工作正常。 numTable 的数据从 (1, 2) 变为 (3, 4)。
我也发现了这个。我删除了 'START TRANSACTION;' 和 'COMMIT' 语句。并再次执行 updateNum SP。结果是...
1 row(s) affected
这一次,UPDATE 查询也运行良好。 numTable 的数据已成功更改。
为什么会出现这种差异?有没有一种方法可以使用 TRANSACTION 语句获得正确的受影响行?
我在 MySQL 5.6.27、MariaDB 10.0.21 和 MariaDB 10.1.8 上进行了测试,结果与上面相同。
感谢您阅读我的问题。
您将使用
获得受影响的行ROW_COUNT()
所以,SELECT ROW_COUNT() 最后
与@Leow 类似,但我发现如果没有交易,并且没有在更新后立即发生,一切都会丢失。所以:
START TRANSACTION;
update ...
select row_count() into @theCount; -- saved for posterity, perhaps for use at end
COMMIT;
select @theCount;