• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:トリガーについて)

トリガーエラーの原因と解決方法

このQ&Aのポイント
  • itemテーブルにINSERTした場合にトリガーでUPDATE_LEVEL()を実行すると、エラーが発生する。
  • エラーのメッセージは「Can't update table 'item' in stored function/trigger because it is already used by statement which invoked this stored function/trigger .」。
  • 原因は、トリガー内で使用しているテーブルを同じトリガー内の別のステートメントで更新しようとしているため。解決方法は、トリガー内で使用するテーブルを更新するステートメントをコメントアウトするか、トリガーを複数のトリガーやストアドプロシージャに分割すること。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

あ、ごめんなさい itemテーブルにデータをつっこんだときに itemテーブル自信をアップデートするということですか? http://dev.mysql.com/doc/refman/5.1/ja/routine-restrictions.html その関数やトリガを実行したステートメントが ( 読み取り、または書込みに ) すでに使用しているテーブルを改変することはできない ・・・という制限があります

takagoo100
質問者

お礼

ご回答有難うございます。 なるほど、たしかにそうですね。 ではitemテーブルにデータを挿入した場合は次に CALL UPDATE_LEVEL(); を呼び出す方法でしか更新する方法ないということなのでしょうか? なにかこのテーブルに関しても自動的(トリガ的な感じで)に更新するやり方があれば良いのですが。。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

無限ループ処理になりそうなので無理だと思います たしょうタイムラグはでますが スケジュール管理用のテーブルをひとつ用意して、 コールしたいイベントが発生したときに管理テーブルのフラグをたて イベントスケジューラでフラグが立っていたらcallしてフラグを消す ・・・的な処理を5分ごとに実行すればある程度目的は達成できるかと どうしても即座に反映したければ、アプリケーション側でCALLする方が 確実ですが。

takagoo100
質問者

お礼

ご回答有難うございます。 なるほど、たしかにそのやり方だと大変そうですね。。 自分もアプリケーション側で呼び出すしかないのかなぁとは思っています。 とりあえず参考になりました。 ありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

外部キー制約とインサートのトリガーが競合していますね 外部キー制約はどうしてもいりますか?

takagoo100
質問者

お礼

ご回答有難うございます。 外部キー制約を次のように DROP TABLE IF EXISTS item; CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, level int NOT NULL, PRIMARY KEY(id) ) DEFAULT CHARSET=utf8; 外して試してみたのですが全く同じようなエラーでした・・・ 外部キーって当然itemテーブルでのことですよね? 一応、自分としては外部キー制約があればもし削除した場合に それに関連する行もついでに削除してくれるし、 あとphpmyadminなどを利用して閲覧するときにリンクが貼ってあってそのカラムを辿れるのが便利だなと思って なんとなく使用しています。 そこら辺も含めて一般的に外部キー制約に対するyambejpさんのお考えがあれば アドバイス頂けないでしょうか?