DELIMITER //란 무엇인가?
MySQL에서 DELIMITER //는 기본 문장 구분자인 세미콜론(;)을 슬래시 두 개(//)로 변경하는 명령어입니다. 이렇게 구분자를 변경하면 트리거 내부에서 세미콜론으로 끝나는 여러 개의 SQL 문장을 하나의 블록으로 작성할 수 있습니다.
트리거 본문 안에는 IF문, SET문 등 세미콜론으로 끝나는 문장이 여러 개 포함되는데, 구분자를 변경하지 않으면 MySQL이 중간에 있는 세미콜론을 만나는 순간 문장이 끝났다고 판단하여 오류가 발생합니다. 따라서 트리거를 정의하기 전에 구분자를 //로 바꾸고, 정의가 끝난 후 다시 원래대로 되돌려 주는 것이 필수적입니다.
트리거 실습 예제
이번 예제에서는 직원 급여(EmployeeSalary)가 1,000 미만으로 입력될 경우 자동으로 10,000으로 설정해 주는 트리거를 만들어 보겠습니다.
1단계: 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table EmployeeTable -> ( -> EmployeeId int, -> EmployeeName varchar(100), -> EmployeeSalary float -> ); Query OK, 0 rows affected (0.76 sec)
2단계: 트리거 생성
테이블 생성이 완료되면 INSERT 명령이 실행되기 전에 동작하는 트리거를 만듭니다. 트리거 생성 쿼리는 다음과 같습니다.
mysql> delimiter // mysql> create trigger CheckSalary before insert on EmployeeTable -> for each row if new.EmployeeSalary < 1000 then set -> new.EmployeeSalary=10000; -> end if; -> // Query OK, 0 rows affected (0.40 sec) mysql> delimiter ;
위 코드에서 눈여겨볼 점은 다음과 같습니다.
- delimiter //: 구분자를 //로 변경하여 트리거 본문의 세미콜론이 문장 종결로 해석되지 않도록 합니다.
- before insert: 데이터가 삽입되기 전에 트리거가 실행되어 값을 조작할 수 있습니다.
- delimiter ;: 트리거 정의가 끝나면 구분자를 다시 세미콜론(;)으로 되돌립니다.
3단계: 트리거 동작 확인
이제 INSERT 명령으로 트리거가 제대로 작동하는지 확인해 보겠습니다. 급여가 1,000 미만인 데이터를 삽입하면 오류 없이 기본값인 10,000이 저장됩니다.
레코드 삽입 쿼리는 다음과 같습니다.
mysql> insert into EmployeeTable values(1,'Carol',500); Query OK, 1 row affected (0.25 sec)
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from EmployeeTable;
실행 결과는 다음과 같습니다.
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 1 | Carol | 10000 | +------------+--------------+----------------+ 1 row in set (0.00 sec)
급여로 500을 입력했지만 결과를 보면 10,000으로 저장된 것을 확인할 수 있습니다. 이것이 바로 BEFORE INSERT 트리거가 동작한 결과입니다.
4단계: 1,000 이상 값 입력 시 동작 확인
반대로 1,000 이상의 값을 입력하면 입력한 값 그대로 저장됩니다. 먼저 TRUNCATE 명령으로 기존 레코드를 삭제합니다.
mysql> truncate table EmployeeTable; Query OK, 0 rows affected (1.44 sec)
새로운 레코드를 삽입하는 쿼리입니다.
mysql> insert into EmployeeTable values(2,'Bob',1000); Query OK, 1 row affected (0.14 sec) mysql> insert into EmployeeTable values(3,'Carol',2500); Query OK, 1 row affected (0.19 sec)
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select *from EmployeeTable;
실행 결과는 다음과 같습니다.
+------------+--------------+----------------+ | EmployeeId | EmployeeName | EmployeeSalary | +------------+--------------+----------------+ | 2 | Bob | 1000 | | 3 | Carol | 2500 | +------------+--------------+----------------+ 2 rows in set (0.00 sec)
정리
위 실행 결과를 보면 급여가 1,000 이상인 경우에는 입력한 값이 그대로 저장된 것을 알 수 있습니다. 반면 급여가 1,000 미만이면 트리거에 의해 기본값인 10,000으로 자동 변경됩니다.
핵심을 요약하면 다음과 같습니다.
- DELIMITER //는 저장 프로시저나 트리거처럼 여러 문장을 포함하는 블록을 정의할 때 필수적인 명령어입니다.
- 구분자를 임시로 변경하면 본문 내부의 세미콜론이 MySQL 클라이언트에 의해 잘못 해석되는 것을 방지할 수 있습니다.
- 블록 정의가 끝나면 반드시 DELIMITER ;로 구분자를 원상복구해야 합니다.