如何在MySQL中的程序中使用UPDATE语句后找出受影响的行?(不使用API mysql_affected_rows())。谢谢!
DROP PROCEDURE IF EXISTS users_login;
DELIMITER //
CREATE PROCEDURE users_login(IN _id INT UNSIGNED)
BEGIN
DECLARE _error TINYINT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _error = TRUE;
UPDATE users SET login = NOW() WHERE id = _id;
IF (_error = TRUE) THEN
SHOW ERRORS;
END IF;
END//
DELIMITER ;
我只是想对程序进行一些检查。
答案 0 :(得分:1)
您不需要手术。它只会产生不必要的开销。
回答你的问题。如果您想知道,首先应该SELECT
,检查哪些行会受到影响。如果您使用InnoDB(它支持事务)而不是MyISAM,您甚至可以在更新之前锁定行,以便并发会话不会在select
和您的{{1}之间更改行声明。您应该在事务中执行此操作,如下所示:
update
当事务以START TRANSACTION;
SELECT whatever FROM your_table WHERE foo = 'bar' FOR UPDATE;
UPDATE your_table SET whatever = 'new_value' WHERE foo = 'bar';
COMMIT;
结束时,锁定会再次释放。
如果您不想先执行commit;
,则可以使用变量来存储受影响行的主键。
(有点hacky并没有经过测试,但它应该有效)
SELECT
它的工作原理如下。 SET @affected_ids := NULL;
UPDATE your_table
SET whatever = 'new_value',
primary_key_column = IF(@affected_ids := CONCAT_WS(',', primary_key_column, @affected_ids), primary_key_column, primary_key_column)
WHERE foo = 'bar';
函数的语法为
IF()
在IF(<boolean expression>, <then>, <else>)
部分中,我们将当前行主键添加到变量中。这总是如此。尽管如此,我们使用主键更新主键,我们在true和false部分指定它。价值没有变化,MySQL实际上足够聪明,甚至无法触摸它。
在<boolean expression>
语句后,您只需
UPDATE
并获取所有已更新的行。