トリガー内の一時テーブル、変数または個別の変数に設定されたストア結果

dba.stackexchange https://dba.stackexchange.com/questions/3479

  •  16-10-2019
  •  | 
  •  

質問

私は、製品テーブルに特定の製品の平均評価を保存するためにいくつかのトリガーを作成する過程にあります。また、製品のレビューの総数を保存するように求められました。したがって、トリガーで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番目は不可能です。あなたが...

  1. 製品テーブルの作成テーブルステートメントで質問を更新します
  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;

これは最初の構文よりも審美的にきれいであると思いますが、クエリは一度だけ実行する必要があります。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top