2012-01-15 9 views
0

私のコードは非常に長く、私はそれを簡単にするつもりです。 私は、次のしている:MYSQLエラーコードの解決策はありますか?1442?

table1 --> have a trigger on insert (call function1 to insert into table2) 
table2 --> have a trigger on insert (call function2) 

function2() 
update table1 depending on a query that table1 is related to. 

と私はそれはすでにこれを呼び出したステートメントで使用されているためエラーが保存された機能/トリガにテーブルtable1を更新することはできません取得....

ので、任意のがあります解決策またはこれに対する回避策...

+0

table2のトリガーがtable1にレコードを挿入すると言っていますか? –

+0

いいえ、table1を更新する関数を実行しています –

+0

実際のコードが大きい場合(実際にはいつでもコードを投稿します)、代わりに[最小サンプルケース](http://sscce.org/)を作成することができます曖昧な図の – outis

答えて

1

トリガーについて理解することは、それらがトランザクションの一部であることです。

したがって、表1を挿入すると、表1を更新する表2を挿入すると、元の挿入がそれ自体に突き当たる可能性があります。実際にまだコミットされていないレコードを元に更新しようとしている場合、理論上はMySQlでトリガされません。

通常のアドバイスは、ただし、できない場合は、中間テーブルを使用して(挿入してTable1とTable2の変更をトリガーする)、または直接挿入を使用せずにストアドプロシージャを使用してテーブルを更新する1 & 2 cummulativley。

代わりにTable1 = Aを挿入するとTable1(A)がCになる とBがAに対して何を行うかを調べ、それをA(c)に挿入しBの対応するレコードを挿入します。

トリガーは素晴らしいですが、怒らないでください。

+0

よく私は中間テーブルのアイデアが好きですが、私はそのテーブルに更新する必要がある値を挿入し、テーブル1を更新するためにトリガを作成する必要があります、更新はまだトランザクションの一部であり、同じ問題。 –

+0

テーブル1と2に何を入れるべきかを明らかにするには、中間のデータ/ロジックが十分である必要があります。中間トリガを挿入すると、相互にトリガすることのないテーブルに挿入されます。私はspソリューションを自分のほうが好きです。あなたの顔はより多くあり、SPがどちらのテーブルにも挿入できるようにパーミッションを設定できますが、ロジックが複雑であれば余分な作業が必要になります。 –

関連する問題