ホームページ >データベース >mysql チュートリアル >MySQL ストアドファンクションまたはトリガー内のテーブルを更新できないのはなぜですか?

MySQL ストアドファンクションまたはトリガー内のテーブルを更新できないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 00:05:20828ブラウズ

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

MySQL エラー: ストアド関数/トリガーのテーブルを更新できません

質問:

トリガーを使用して MySQL テーブルに新しい行を挿入しようとすると、次のエラーが発生します発生:

Can't update table 'brandnames' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

回答:

このエラーは、INSERT トリガーがそれを呼び出したテーブルを変更しようとすると発生します。 MySQL は、次の 2 つの主な理由によりこの動作を禁止しています:

  • ロックの競合: INSERT はロック操作を実行する可能性があり、トリガーもテーブルをロックしようとするとデッドロックが発生する可能性があります。
  • 無限再帰: トリガーが同じ行を更新する場合テーブルにあるように、同じトリガーが無限に起動され、無限ループが発生する可能性があります。

このエラーを解決するには、次のアプローチの使用を検討してください。

  • 新しい値へのアクセス: トリガー内のテーブルを変更する代わりに、NEW.fieldname を使用して新しく挿入された値にアクセスし、他のフィールドを設定します。
  • 挿入前の変更: BEFORE INSERT トリガーを使用して、テーブルに挿入される前に値を変更します。これにより、無限再帰の問題が回避されます。

たとえば、フルネームの最初の 2 文字から短縮名フィールドを作成するには、次の BEFORE INSERT トリガーを使用できます:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END

以上がMySQL ストアドファンクションまたはトリガー内のテーブルを更新できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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