MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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文で複数の行が対象になった場合でも、行ごとにトリガーが発火するため、行単位での細かい制御が必要な処理(監査ログの記録や関連テーブルへの自動反映など)に非常に役立ちます。

  1. VoWiFi通話サービスとは?その目的と仕組みを徹底解説

    スマートフォンで快適に通話するには、良好な電波状況が欠かせません。しかし、電波の届きにくい場所では、VoWiFiのようなサービスが大きな助けとなります。「VoWiFi通話サービスとは何か、何のために使われ、どのように機能するのか?」――本記事で詳しく解説します。 ここで紹介するのは、インターネット回線を通じてスマートフォンから通話を行う方法です。Skypeなどを使った通話手段もありますので、あわせて知っておくと便利でしょう。 VoWiFi通話サービスとは?その目的と仕組み ユーザーとモバイル端末との快適なやり取りは、通信事業者にとって成功の鍵となる重要な要素です。そこで、端末の電波状況が悪くて

  2. インターネットはどのように機能するのか?基礎から学べる無料ネットワーキングコース

    私たちの日常生活に欠かせない存在となったインターネット。しかし、その実際の仕組みについて深く考えたことはありますか?無料でプログラミングを学べることで知られるfreeCodeCamp.orgのYouTubeチャンネルでは、インターネットの動作原理と基本的なネットワークの概念を学べる約2時間のコースが公開されました。講師を務めるのはIan Frost氏です。豊富な教育経験を持つ同氏は、複雑なトピックを分かりやすい図解で説明することに長けており、これまでUdemyでも数千人に講義を行ってきた実績があります。このコースは前提知識を一切必要とせず、ゼロからすべてを丁寧に解説してくれるため、技術的なバッ