トリガー内の一時テーブル、変数または個別の変数に設定されたストア結果
質問
私は、製品テーブルに特定の製品の平均評価を保存するためにいくつかのトリガーを作成する過程にあります。また、製品のレビューの総数を保存するように求められました。したがって、トリガーで2つの値を取得し、ターゲットテーブルを適切に更新する必要があります。
個別の選択ステートメントを使用する必要があります
SET my_a = SELECT a FROM foo;
SET my_b = SELECT b FROM foo;
結果セットを変数として取得するための単一のステートメント(これも可能ですか?):
SET var = SELECT (a,b) FROM foo;
UPDATE bar SET c=var.a,d=var.b;
または、結果を保存することも、トリガー内の一時テーブルに設定します(is それ 可能ですか?)?
解決
最初の方法は、生成されたクエリのオーバーヘッドが最も少ないため、最適です。実際、MySQLストアドプロシージャ言語では、可能な限り宣言された変数が少なくなります。
MySQLに保存されているRrocedure言語にはオブジェクトサポートがないため、2番目は不可能です。あなたが...
- 製品テーブルの作成テーブルステートメントで質問を更新します
- これまでのところ、トリガーのてやしを見せてください
MySQLトリガーでは、ダイナミックSQLを介した明示的なDDLとDDLが許可されていないため、3番目の方法は不可能です.
どちらかを使用して通常のテーブルを作成する必要がある場合があります ミサム また メモリー ストレージエンジン。次に、トリガーを実際に存在するテーブルにデータをコンパイルさせることができます。 ミサム サーバーがダウンした場合、これまでにコンパイルされたデータがディスク上にあるため、より良いです。 メモリー テーブルは書き込みが速いですが、システムの再起動で行われます。
使用禁止 一時テーブルを作成します まったく このようなテーブルは、DB接続が存在する限り続くだけであり、トリガーの呼び出しまでプライベートになるからです。さらに悪いことに、MySQLレプリケーションを使用していて実行している場合 STOP SLAVE
スレーブでは、Createの一時テーブルを介して作成されたテーブルは、SQLスレッドから消え、実行時にすぐにレプリケーションが壊れます START SLAVE
そして、これらの温度テーブルはもはや存在しません。
他のヒント
これはかなり古い質問なので、この構文は以前は存在しなかったかもしれませんが、今では使用できます SELECT INTO
:
SELECT a, b INTO my_a, my_b FROM foo;
これは最初の構文よりも審美的にきれいであると思いますが、クエリは一度だけ実行する必要があります。