テーブルYのレコードをINSERT
するたびに、テーブルXでSELECT
ステートメントを実行しようとしていますが、MySQLのみを使用してそれを実行できる方法はありますか?
トリガーのようなもの?
簡単な答えは「いいえ」です。トリガーはINSERT
、UPDATE
、またはDELETE
でトリガーされます。
この(奇妙な)シナリオの可能な解決策:
SELECT
sを実行するいくつかのストアドプロシージャを記述します。SELECT
を使用できないようにします。INSERT
など)を実行するストアドプロシージャも呼び出します。いいえ-SELECTでトリガーすることはできません-クエリステートメントで暗黙的に呼び出すストアドプロシージャ(またはログファイルなどの他のタイプのロギング機能)を作成する必要があります-作成すると簡単になりますクエリを呼び出し、ロギングを呼び出し、クエリ結果を返すラッパー。
テーブルXを使用してテーブルYのSELECT
クエリの順序をログに記録しようとしている場合(かなり一般的なクエリログ設定)、操作の順序を逆にしてINSERT
クエリを実行できます最初 、次にSELECT
クエリを実行します。
そうすれば、2つのステートメントをTRIGGER
にリンクすることを心配する必要はありません。2つのステートメント間でサーバーがクラッシュした場合は、最初のステートメントで気になることをすでにログに記録しており、SELECT
クエリが実行されるか失敗するかは記録されていません。基盤となるデータベースへの影響。
クエリをログに記録していない場合は、テーブルYをタスクキューとして使用しようとしている可能性があります-私が苦労していた状況がこのスレッドにつながります-そして、最初にYをクエリしたセッションで他のすべてのセッションをロックする必要があります返された行から、結果に対していくつかの操作を実行し、出力をテーブルXに挿入できるようにします。その場合は、テーブルYにいくつかのロギング機能を追加するだけです。
たとえば、Yに「owner」列を追加し、WHERE
クエリのSELECT
部分をUPDATE
ステートメントに追加して実行し、SELECT
クエリを変更して、UPDATE
によって要求された結果のみを表示できます。
UPDATE Y SET owner = 'me' WHERE task = 'new' AND owner IS NULL;
SELECT foo FROM Y WHERE task = 'new' AND owner = 'me';
... fooでいくつかの作業を行ってから、...
INSERT INTO X (output) VALUES ('awesomeness');
繰り返しになりますが、重要なのはログに記録することです最初、次にクエリを実行します。