2014-11-08 40 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

相關問題