CreatetableSample(idint,valuevarchar(20));QueryOK,0rowsaffected(0.47sec)mysql>InsertintoSample (id , nilai"/> CreatetableSample(idint,valuevarchar(20));QueryOK,0rowsaffected(0.47sec)mysql>InsertintoSample (id , nilai">

Rumah  >  Artikel  >  pangkalan data  >  Bagaimanakah 'FOR EACH ROW' dalam pencetus MySQL berfungsi?

Bagaimanakah 'FOR EACH ROW' dalam pencetus MySQL berfungsi?

PHPz
PHPzke hadapan
2023-09-06 18:17:06710semak imbas

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)

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 ;

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)

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)

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!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam