挿入後に同じテーブル内の既存の行を更新するための MySQL トリガー
問題ステートメント
の場合新しい行が ACCOUNTS テーブルに挿入され、同じテーブル内の対応する既存の行が新しく挿入された行の edit_on 列に等しい pk は、その status 列を「E」に設定して更新する必要があります。ただし、トリガー内でこの更新を試行すると、トリガーを呼び出したステートメントによってテーブルが既に使用されていることを示すエラーが発生します。
解決策
原因トリガー ステートメントによってすでに変更されているトリガー内のテーブルの更新に対する制限がある場合、別のアプローチは次のとおりです。必須。
ストアド プロシージャ
挿入操作と更新操作の両方を 1 つのトランザクションで処理するストアド プロシージャを作成します。関係する手順は次のとおりです。
SQL 構文
CREATE PROCEDURE setEditStatus(IN NEW_pk INT, IN NEW_edit_on INT) BEGIN /* Insert new row into ACCOUNTS table */ INSERT INTO ACCOUNTS (pk, user_id, edit_on, status) VALUES (NEW_pk, /* User ID */, NEW_edit_on, 'A'); /* Update existing row */ UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_edit_on; /* Commit changes */ COMMIT; END;
トリガー
代わりにストアド プロシージャを呼び出すようにトリガーを変更します。アップデートを直接試行する場合。
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN CALL setEditStatus(NEW.pk, NEW.edit_on); END$$ DELIMITER ;
これこの回避策により、トリガー内の同じテーブルの更新に関する制限に違反することなく、目的の更新を実行できるようになります。
以上がトリガー ロックを使用せずに挿入後に MySQL の既存の行を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。