Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

'สำหรับแต่ละแถว' ทำงานในทริกเกอร์ MySQL อย่างไร


จริงๆ แล้ว 'FOR EACH ROW' หมายถึงแถวที่ตรงกันแต่ละแถวที่ได้รับการอัปเดตหรือลบ กล่าวอีกนัยหนึ่ง เราสามารถพูดได้ว่าทริกเกอร์ไม่ได้ใช้กับแต่ละแถว มันแค่บอกว่าจะเรียกใช้ตัวทริกเกอร์สำหรับแถวของตารางที่ได้รับผลกระทบแต่ละแถว เราสามารถอธิบายได้โดยตัวอย่างต่อไปนี้ -

ตัวอย่าง

ในตัวอย่างนี้ เรากำลังสร้างสองตาราง คือ 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)

ตอนนี้ เราจะสร้างทริกเกอร์ที่ทริกเกอร์ก่อนที่จะลบค่าใดๆ ในตาราง 'ตัวอย่าง' ดังนี้ -

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 -

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)

ด้วยความช่วยเหลือจากตัวอย่างข้างต้น เป็นที่ชัดเจนว่า 'FOR EACH ROW' หมายถึงแถวที่ตรงกันแต่ละแถวที่ได้รับการอัปเดตหรือลบ