0

我想在更新表后触发。在此表上执行更新查询时,我想对其他表进行更改。所以,我需要知道受影响的行数是否大于 0。

确切的场景:

Table: table_user
userid (primary key)
no_changes_status (true means no update has been made on table_website for this userid)

Table: table_website
userid (reference key)
website_url (when the value of this field is changed, no_changes_status should be set to false)

我想在 table_website 上创建一个触发器,它将检查每个插入和更新的number_of_affected_rows。如果number_of_affected_rows 大于 0,则触发器将使 no_changes_status 为 false。

我找不到任何可用于确定触发的number_of_affected_rows的语法/函数。

其他人在MySQL 论坛上提出了几乎相同的问题

4

2 回答 2

3

这不能在更新触发器中完成,因为它是为每一行调用的。

提出的解决方案:

我希望你有一个用户定义的过程来做这个更新,如果没有,那么我建议你创建一个这样的过程。

在此过程中,运行更新查询后,您可以获得受影响的行数

SELECT ROW_COUNT();

您可以将其用于进一步处理。RowCount()手册

希望这可以帮助。

于 2012-09-14T10:28:46.753 回答
0

这是不可能的,因为触发器操作基于行 ( FOR EACH ROW...)。您必须先做一个SELECT,看看有多少行会受到影响,然后做任何必要的事情。在您的代码中解决它,而不是在触发器中。

手动输入

编辑:

如果它只是一行,您可以执行以下操作:

DELIMITER $$

CREATE TRIGGER testref BEFORE INSERT ON table_website
  FOR EACH ROW BEGIN
    SELECT @aff_rows:=COUNT(*) FROM table_website WHERE yourCondition = sameConditionUsedForYourInsert
    AND (
    OLD.col1 != NEW.col1 OR
    OLD.col2 != NEW.col2 ...);
    IF @aff_rows > 0 THEN
       UPDATE table_user SET no_changes_status = whatever WHERE whatever;
    END IF;
  END;

$$
DELIMITER ;
于 2012-09-14T10:21:51.613 回答