如何在MySQL程序中的UPDATE语句之后找出哪些行受到影响?

时间:2014-11-08 17:35:56

标签: mysql mysqli

如何在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 ;

我只是想对程序进行一些检查。

1 个答案:

答案 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

并获取所有已更新的行。