MySQL에서 특정 필드에 0 값이 저장되는 것을 막고 싶다면, BEFORE INSERT 트리거를 사용하는 것이 가장 효과적인 방법입니다. 이 글에서는 실제 예제를 통해 0 값의 삽입을 자동으로 거부하는 트리거를 만드는 과정을 단계별로 살펴보겠습니다.
1. 테스트용 테이블 생성
먼저 실습에 사용할 간단한 테이블을 생성합니다.
mysql> create table DemoTable(Value int); Query OK, 0 rows affected (0.85 sec)
2. 0 값 삽입을 차단하는 트리거 생성
다음으로, INSERT 작업이 실행되기 전에 새로 들어오는 값(new.Value)이 0인지 검사하고, 0이라면 에러를 발생시켜 삽입 자체를 중단시키는 트리거를 만듭니다.
mysql> DELIMITER //
mysql> create trigger preventing_to_insert_zero_value
before insert on DemoTable
for each row
begin
if(new.Value = 0) then SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You can not provide 0 value';
END if;
end
//
Query OK, 0 rows affected (0.34 sec)
mysql> DELIMITER ;여기서 핵심은 SIGNAL SQLSTATE '45000' 구문입니다. SQLSTATE 코드 45000은 사용자가 직접 정의한 오류를 의미하며, MESSAGE_TEXT에 지정한 메시지가 클라이언트에게 그대로 전달됩니다.
3. 0 값 삽입 시도 — 차단되는지 확인
이제 실제로 0 값을 삽입해 보면, 트리거가 동작하여 입력이 거부됩니다.
mysql> insert into DemoTable values(0); ERROR 1644 (45000): You cannot provide 0 value
위와 같이 에러 메시지와 함께 삽입이 실패하는 것을 확인할 수 있습니다. 즉, 트리거 덕분에 해당 테이블에는 더 이상 0 값이 저장되지 않습니다.
4. 다른 값은 정상적으로 삽입 가능
트리거는 오직 0 값만 차단하므로, 그 외의 값들은 아무 문제 없이 입력됩니다.
mysql> insert into DemoTable values(10); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(-1000); Query OK, 1 row affected (0.41 sec)
5. 결과 확인
SELECT 문으로 테이블의 전체 데이터를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 10 | | -1000 | +-------+ 2 rows in set (0.00 sec)
정리
BEFORE INSERT 트리거와 SIGNAL 구문을 조합하면 애플리케이션 코드 수정 없이도 데이터베이스 레벨에서 0 값의 입력을 확실하게 방지할 수 있습니다. 음수나 양수 등 다른 값은 정상적으로 저장되며, 데이터 무결성을 강화하는 데 매우 유용한 기법입니다.