MySQL에서 새로운 트리거를 생성하려면 CREATE TRIGGER 문을 사용해야 합니다. 기본 문법은 다음과 같습니다.
CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
...
END;
주요 구성 요소 살펴보기
- trigger_name(트리거 이름): CREATE TRIGGER 문 바로 뒤에 위치하는 트리거의 이름입니다. 일반적으로 [트리거 시간]_[테이블명]_[트리거 이벤트] 형식의 네이밍 규칙을 따르는 것이 좋습니다. 예를 들어 before_student_update 또는 after_student_insert 같은 이름을 사용할 수 있습니다.
- trigger_time(트리거 실행 시점): 트리거가 활성화되는 시점을 의미하며, BEFORE 또는 AFTER 중 하나를 반드시 지정해야 합니다. 테이블에 변경이 적용되기 전에 작업을 처리하려면 BEFORE를, 변경이 적용된 후에 작업을 처리하려면 AFTER를 사용합니다.
- trigger_event(트리거 이벤트): INSERT, UPDATE, DELETE 중 하나로, 해당 이벤트가 발생할 때 트리거가 호출됩니다. 하나의 트리거는 단 하나의 이벤트에만 반응할 수 있으므로, 여러 이벤트에 대응하는 트리거가 필요하다면 각 이벤트마다 별도의 트리거를 정의해야 합니다.
- table_name(테이블 이름): 트리거는 항상 특정 테이블과 연결됩니다. 테이블 없이는 트리거가 존재할 수 없기 때문에 ON 키워드 뒤에 반드시 테이블 이름을 명시해야 합니다.
- BEGIN…END: 트리거의 실제 로직을 정의하는 코드 블록입니다.
실습 예제
다음과 같이 Student_age 테이블을 먼저 생성해 보겠습니다.
mysql> Create table Student_age(age INT, Name Varchar(35));
Query OK, 0 rows affected (0.80 sec)
이제 누군가 0보다 작은 나이 값을 삽입하려고 할 때, 자동으로 age = 0으로 대체해 주는 트리거를 만들어 보겠습니다.
mysql> DELIMITER //
mysql> Create Trigger before_inser_studentage BEFORE INSERT ON student_age FOR EACH ROW
BEGIN
IF NEW.age < 0 THEN SET NEW.age = 0;
END IF;
END //
Query OK, 0 rows affected (0.30 sec)
트리거 동작 확인하기
아래와 같이 데이터를 삽입하면 트리거가 자동으로 호출됩니다.
mysql> INSERT INTO Student_age(age, Name) values(30, 'Rahul');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO Student_age(age, Name) values(-10, 'Harshit');
Query OK, 1 row affected (0.11 sec)
mysql> Select * from Student_age;
+------+---------+
| age | Name |
+------+---------+
| 30 | Rahul |
| 0 | Harshit |
+------+---------+
2 rows in set (0.00 sec)
위 결과 집합을 보면, 음수 값(-10)을 삽입하려고 했음에도 불구하고 트리거가 이를 감지하여 0으로 변환해 저장한 것을 확인할 수 있습니다.
이 예제는 트리거 이벤트가 INSERT이고, 트리거 실행 시점이 BEFORE인 경우의 대표적인 사례입니다. 같은 방식으로 UPDATE나 DELETE 이벤트, 그리고 AFTER 시점을 조합하여 다양한 데이터 무결성 검증 로직을 손쉽게 구현할 수 있습니다.