Computer >> 컴퓨터 >  >> 프로그램 작성 >> MySQL

MySQL 트리거에서 'FOR EACH ROW'는 어떻게 작동합니까?


실제로 '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)

이제 다음과 같이 '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)

위의 예를 통해 'FOR EACH ROW'는 업데이트되거나 삭제되는 일치하는 각 행을 의미한다는 것이 분명합니다.