ホームページ >データベース >mysql チュートリアル >トリガー ロックを使用せずに挿入後に MySQL の既存の行を更新するにはどうすればよいですか?

トリガー ロックを使用せずに挿入後に MySQL の既存の行を更新するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-13 00:28:09803ブラウズ

How to Update an Existing Row in MySQL After an Insert Without Trigger Locking?

挿入後に同じテーブル内の既存の行を更新するための MySQL トリガー

問題ステートメント

の場合新しい行が ACCOUNTS テーブルに挿入され、同じテーブル内の対応する既存の行が新しく挿入された行の edit_on 列に等しい pk は、その status 列を「E」に設定して更新する必要があります。ただし、トリガー内でこの更新を試行すると、トリガーを呼び出したステートメントによってテーブルが既に使用されていることを示すエラーが発生します。

解決策

原因トリガー ステートメントによってすでに変更されているトリガー内のテーブルの更新に対する制限がある場合、別のアプローチは次のとおりです。必須。

ストアド プロシージャ

挿入操作と更新操作の両方を 1 つのトランザクションで処理するストアド プロシージャを作成します。関係する手順は次のとおりです。

  1. ACCOUNTS テーブルに新しい行を挿入します。
  2. pk が新しく挿入された行の edit_on 列と一致する既存の行を更新し、ステータスを設定します。列を「E」にします。
  3. トランザクションをコミットして、

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。