Bagaimanakah 'FOR EACH ROW' dalam pencetus MySQL berfungsi?

PHPz
Lepaskan: 2023-09-06 18:17:06
ke hadapan
697 orang telah melayarinya

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

Sebenarnya "UNTUK SETIAP BARIS" bermaksud setiap baris yang sepadan dikemas kini atau dipadamkan. Dalam erti kata lain, kita boleh mengatakan bahawa pencetus tidak digunakan pada setiap baris, ia hanya mengatakan bahawa badan pencetus dilaksanakan untuk setiap baris jadual yang terjejas. Kita boleh menggambarkan ini dengan contoh berikut -

Contoh

Dalam contoh ini, kami mencipta dua jadual, Sampel dan Sample_rowaffected seperti berikut -

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)
Salin selepas log masuk

Sekarang, kami akan mencipta pencetus yang akan memadamkan jadual Dicetuskan sebelum sebarang nilai dalam " Sample" seperti yang ditunjukkan di bawah -

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 ;
Salin selepas log masuk

Sekarang, pertanyaan berikut akan memadamkan beberapa nilai dari jadual "Sample" dan bilangan baris yang dipadam akan disimpan dalam @count user variable -

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)
Salin selepas log masuk

Dengan bantuan Dengan yang berikut pertanyaan, kita boleh menyemak nilai baris yang terjejas oleh pemadaman, dimasukkan ke dalam jadual sample_rowaffected seperti berikut -

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)
Salin selepas log masuk

Dengan bantuan contoh di atas, jelas bahawa "UNTUK SETIAP BARIS" bermaksud setiap baris yang sepadan yang dikemas kini atau dipadamkan.

Atas ialah kandungan terperinci Bagaimanakah 'FOR EACH ROW' dalam pencetus MySQL berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan