MySQLトリガーにおける「FOR EACH ROW」の仕組みをわかりやすく解説
MySQLのトリガー定義で使われる「FOR EACH ROW」は、UPDATEやDELETEの対象となった(マッチした)各行ごとにトリガーの処理を実行することを意味します。つまり、トリガーがテーブル全体に対して一度だけ適用されるのではなく、影響を受けたテーブルの行1件ごとにトリガーの本体(トリガーボディ)が実行される、という指定なのです。
この動作を理解するために、具体的な例を見ていきましょう。
例:サンプルテーブルの準備
まず、2つのテーブル「Sample」と「Sample_rowaffected」を作成します。
mysql> Create table Sample(id int, value varchar(20)); Query OK, 0 rows affected (0.47 sec) mysql> Insert into Sample(id, value) values(100, 'same'),(101, 'Different'),(500, 'excellent'),(501, 'temporary'); Query OK, 4 rows affected (0.04 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> Select * from Sample; +------+-----------+ | id | value | +------+-----------+ | 100 | same | | 101 | Different | | 500 | excellent | | 501 | temporary | +------+-----------+ 4 rows in set (0.00 sec) mysql> Create table Sample_rowaffected(id int); Query OK, 0 rows affected (0.53 sec) mysql> Select Count(*) as 'Rows Affected' from sample_rowaffected; +---------------+ | Rows Affected | +---------------+ | 0 | +---------------+ 1 row in set (0.10 sec)
この時点で、Sampleテーブルには4件のデータが登録されており、Sample_rowaffectedテーブルは空(0件)の状態です。
DELETE前に発火するトリガーの作成
次に、Sampleテーブルの行が削除される直前に発火するトリガーを作成します。
mysql> Delimiter //
mysql> Create trigger trigger_before_delete_sample BEFORE DELETE on Sample
-> FOR EACH ROW
-> BEGIN
-> SET @count = if (@count IS NULL, 1, (@count+1));
-> INSERT INTO sample_rowaffected values (@count);
-> END ;
-> //
Query OK, 0 rows affected (0.15 sec)
mysql> Delimiter ;このトリガーでは、ユーザー変数「@count」を使って削除された行数をカウントし、その値をsample_rowaffectedテーブルに挿入しています。
DELETE文の実行と結果確認
それでは、Sampleテーブルから条件に合致する行を削除してみましょう。削除された行数は@count変数に記録されます。
mysql> Delete from Sample WHERE ID >=500; Query OK, 2 rows affected (0.11 sec) mysql> Select @count; +--------+ | @count | +--------+ | 2 | +--------+ 1 row in set (0.03 sec)
@countの値が「2」になっていることがわかります。続いて、トリガーによってsample_rowaffectedテーブルに挿入された内容を確認します。
mysql> Select Count(*) as 'Rows Affected' from sample_rowaffected; +---------------+ | Rows Affected | +---------------+ | 2 | +---------------+ 1 row in set (0.00 sec) mysql> Select * from Sample; +------+-----------+ | id | value | +------+-----------+ | 100 | same | | 101 | Different | +------+-----------+ 2 rows in set (0.00 sec)
まとめ
この例から、「FOR EACH ROW」の動作が明確になりました。DELETE文によってidが500以上の2行が削除されると、トリガーボディが2回実行され、sample_rowaffectedテーブルには2件のレコードが挿入されています。
つまり「FOR EACH ROW」とは、UPDATEやDELETEなどの操作で影響を受ける(マッチした)各行に対して、トリガーの処理が個別に実行されることを意味します。単一のSQL文で複数の行が対象になった場合でも、行ごとにトリガーが発火するため、行単位での細かい制御が必要な処理(監査ログの記録や関連テーブルへの自動反映など)に非常に役立ちます。
-
VoWiFi通話サービスとは?その目的と仕組みを徹底解説
スマートフォンで快適に通話するには、良好な電波状況が欠かせません。しかし、電波の届きにくい場所では、VoWiFiのようなサービスが大きな助けとなります。「VoWiFi通話サービスとは何か、何のために使われ、どのように機能するのか?」――本記事で詳しく解説します。 ここで紹介するのは、インターネット回線を通じてスマートフォンから通話を行う方法です。Skypeなどを使った通話手段もありますので、あわせて知っておくと便利でしょう。 VoWiFi通話サービスとは?その目的と仕組み ユーザーとモバイル端末との快適なやり取りは、通信事業者にとって成功の鍵となる重要な要素です。そこで、端末の電波状況が悪くて
-
インターネットはどのように機能するのか?基礎から学べる無料ネットワーキングコース
私たちの日常生活に欠かせない存在となったインターネット。しかし、その実際の仕組みについて深く考えたことはありますか?無料でプログラミングを学べることで知られるfreeCodeCamp.orgのYouTubeチャンネルでは、インターネットの動作原理と基本的なネットワークの概念を学べる約2時間のコースが公開されました。講師を務めるのはIan Frost氏です。豊富な教育経験を持つ同氏は、複雑なトピックを分かりやすい図解で説明することに長けており、これまでUdemyでも数千人に講義を行ってきた実績があります。このコースは前提知識を一切必要とせず、ゼロからすべてを丁寧に解説してくれるため、技術的なバッ