[MySQL/Maria] Update Trigger에서 데이터 NULL 비교 시 주의할 점
데이터베이스에서 Trigger
는 특정 테이블에 대해서 데이터가 변경되는 쿼리 수행 전, 후에 우리가 원하는 작업을 DB가 수행하도록 해줍니다. UPDATE Trigger
를 만들고 테스트 중 데이터가 NULL일 경우 compare되지 않는 현상 및 방안을 정리합니다.
아래와 같이 테이블을 만들고 초기 데이터를 INSERT
합니다.
reserve
테이블은 원본 데이터이고 insert_here_by_trigger
는 뒤에서 만들 trigger에 의해 데이터가 insert되는 테이블입니다.
위에 INSERT
구문으로 인해 reserve
테이블에는 아래와 같이 초기 데이터가 있습니다. detail
컬럼에 null이 들어가 있는 것을 확인할 수 있습니다.
이 상태에서 아래와 같이 UPDATE trigger
를 만듭니다. trigger를 설명하면, reserve
테이블에 UPDATE
하기 전 name 컬럼과 detail 컬럼의 데이터가 변경 될 경우 insert_here_by_trigger
에 데이터를 추가하는 trigger 입니다.
우선 아래와 같이 name 컬럼을 다른 데이터로 변경합니다. 그러면 우리가 위에서 만든 trigger가 insert_here_by_trigger
테이블에 데이터를 추가 한 것을 확인할 수 있습니다.
이번엔 detail 컬럼의 데이터를 변경합니다. 한 가지 주의사항은 이 데이터는 현재 NULL
입니다. 아래와 같이 detail 컬럼을 변경 후 insert_here_by_trigger
테이블을 확인해보면 우리가 만든 trigger가 작동하지 않은 것을 알 수 있습니다.
detail 컬럼을 update 한 상태에서 다시 update 해보면 trigger가 정상적으로 동작함을 확인할 수 있습니다.
처음에 detail 컬럼을 update 했을 때 동작하지 않은 이유는 NULL 값은 compare를 통해 변했다고 인지하지 않기 때문입니다. 따라서 trigger를 아래와 같이 COALESCE
로 NULL일 경우 ‘’로 치환하는 작업을 거칩니다.
기존 reserve
, insert_here_by_trigger
테이블을 삭제 후 다시 초기 값을 넣었습니다. 즉 reserve 테이블의 detail 컬럼은 현재 NULL
입니다. 이 상태에서 아래와 같이 UPDATE를 수행하면 trigger가 NULL을 ‘’로 변경하여 우리가 원하는 대로 trigger가 수행함을 확인할 수 있습니다.