Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 트리거에서 DELIMITER //의 역할과 사용법 완벽 정리

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 ;로 구분자를 원상복구해야 합니다.