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影響を受ける行数を確認してから、必要なことを行う必要があります。トリガーではなく、コードで解決してください。

手入力

編集:

1行だけの場合は、次のようにすることができます:

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 に答える