2014-11-08 95 views
-1

如何在使用MySQL中的过程中的UPDATE语句之后找出受影响的行?(不使用API​​ mysql_affected_rows())。谢谢!如何找出哪些行在MySQL过程中的UPDATE语句后受到影响?

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

包括你试过的东西。 – EternalHour 2014-11-08 17:41:24

+0

我刚刚加入了一个例子。 – 2014-11-08 17:54:18

回答

1

你不需要你的程序。它只会产生不必要的开销。

回答你的问题。如果你想知道,你应该首先做一个SELECT,来检查哪些行会受到影响。如果您使用InnoDB(它支持事务)而不是MyISAM,则甚至可以在更新之前锁定行,以便并发会话不会更改您的selectupdate语句之间的行。你应该这样做在一个事务中,像这样:

START TRANSACTION; 
SELECT whatever FROM your_table WHERE foo = 'bar' FOR UPDATE; 
UPDATE your_table SET whatever = 'new_value' WHERE foo = 'bar'; 
COMMIT; 

当事务与commit;结束后,锁被再次释放。

如果您不想先执行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>) 

<boolean expression>部分,我们的主键添加当前行的变量。这总是如此。尽管如此,我们用主键更新了主键,我们在true和false部分都指定了它。值不会改变,MySQL实际上足够聪明,甚至不会触及它。

UPDATE语句后,你根本就

SELECT @affected_ids; 

,并得到更新的所有行。

+0

我创立了有趣的想法。谢谢! – 2014-11-09 10:07:20