MySQL에서 트리거(trigger)를 정의할 때는 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 작업의 대상이 되는 행(row)의 컬럼 값을 직접 참조할 수 있습니다. 이때 OLD와 NEW라는 두 가지 키워드를 사용하며, 각각 다음과 같은 역할을 합니다.
- OLD.column_name: 변경되기 전 원래 행(original row)의 컬럼 값을 참조합니다.
- NEW.column_name: 변경된 후의 새로운 행(new row)의 컬럼 값을 참조합니다.
다만 OLD와 NEW 키워드는 아무 때나 사용할 수 있는 것이 아니라, 트리거를 발생시키는 이벤트(INSERT, UPDATE, DELETE)에 따라 허용 여부가 달라집니다.
트리거 이벤트별 키워드 사용 규칙
- INSERT 트리거: NEW.column_name은 새로 삽입될 행의 컬럼 값을 의미합니다. 삽입되기 이전의 데이터가 존재하지 않으므로 OLD는 사용할 수 없습니다.
- DELETE 트리거: OLD.column_name은 삭제될 행의 컬럼 값을 의미합니다. 삭제 후에는 새로운 데이터가 남지 않으므로 NEW는 사용할 수 없습니다.
- UPDATE 트리거: OLD.column_name은 수정되기 전의 값, NEW.column_name은 수정된 후의 값을 각각 나타냅니다. 두 키워드 모두 사용 가능합니다.
정리하면, OLD는 읽기 전용(read-only)으로만 사용해야 하며, NEW는 값을 읽는 것뿐 아니라 변경하는 것도 가능합니다.
OLD 키워드 활용 예시 — DELETE 트리거
아래 예제는 DELETE 트리거에서 OLD 키워드를 사용하여 삭제되는 행의 데이터를 별도의 로그 테이블에 기록하는 방법을 보여줍니다.
mysql> CREATE TRIGGER studentinfo_after_delete -> AFTER DELETE -> ON student_info -> FOR EACH ROW FOLLOWS -> BEGIN -> DECLARE vuser varchar(30); -> SELECT USER() into vuser; -> INSERT INTO student_info_deleted(id,deleted_date,deleted_by) VALUES(OLD.id,SYSDATE(),vuser); -> END; // Query OK, 0 rows affected (0.25 sec)
이 트리거는 student_info 테이블에서 행이 삭제될 때마다 실행되며, OLD.id를 통해 삭제된 학생의 ID를 가져와 삭제 일시와 함께 백업 테이블에 저장합니다.
NEW 키워드 활용 예시 — INSERT 트리거
다음 예제는 INSERT 트리거에서 NEW 키워드를 사용하여 입력되는 값을 검증하고 수정하는 방법을 보여줍니다.
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)
이 트리거는 student_age 테이블에 데이터가 삽입되기 전(BEFORE INSERT)에 실행되어, 나이(age) 값이 0보다 작으면 자동으로 0으로 변경합니다. 이처럼 NEW 키워드는 BEFORE INSERT 또는 BEFORE UPDATE 트리거에서 들어오는 값을 사전에 검증하거나 보정하는 용도로 유용하게 활용됩니다.