MySQL トリガーの「FOR EACH ROW」はどのように機能しますか?

PHPz
リリース: 2023-09-06 18:17:06
転載
700 人が閲覧しました

MySQL 触发器中的“FOR EACH ROW”如何工作?

実際には、「FOR EACH ROW」とは、一致するすべての行が更新または削除されることを意味します。つまり、トリガーはすべての行に適用されるのではなく、影響を受けるテーブルのすべての行に対してトリガー本体が実行されるだけであると言えます。これを次の例で説明します。 -

Example

この例では、次のように、Sample と Sample_rowaffected という 2 つのテーブルを作成します。-

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" 内の値を削除する前に起動されるクエリが作成されます -

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 ;
ログイン後にコピー

ここで、次のクエリはテーブル "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)
ログイン後にコピー

次のクエリを使用すると、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)
ログイン後にコピー

in 上記の例を見ると、「FOR EACH ROW」が一致するすべての行を更新または削除することを意味することは明らかです。

以上がMySQL トリガーの「FOR EACH ROW」はどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート