mysql触发更新受影响的行数条件

时间:2012-09-14 09:59:22

标签: mysql

我希望在更新表后触发。在此表上执行更新查询时,我想对其他表进行更改。所以,我需要知道受影响的行数是否大于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 forum提出了几乎相同的问题

2 个答案:

答案 0 :(得分:3)

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

建议的解决方案:

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

在此过程中,运行更新查询后,您可以使用

获取受影响的行数
SELECT ROW_COUNT();

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

希望这有帮助。

答案 1 :(得分:0)

由于触发器基于行(FOR EACH ROW...)运行,因此无法实现。您必须首先执行SELECT并查看将受影响的行数,然后执行任何必要的操作。在代码中解决它,而不是在触发器中解决。

Manual entry

编辑:

如果它只是一行,你可以做类似的事情:

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 ;
相关问题