sql, column is null과 column = null
‘is null’과 ‘= null’의 차이를 명확하게 확인할 필요가 있었다
- sql을 사용하면서
column is null
과column = null
의 차이가 궁금했다. - 특히 아래와 같이 sql mapping를 활용하여 어플리케이션에서 쿼리를 날릴 때 기대하는 방향대로 동작하지 않을까 걱정했다.
void updateName(){
Test test = new Test();
test.setName("kim");
test.setId(null);
mapper.update(test); // update tests set name = ? where id = ?;
}
- sql mapper인 mybatis를 활용하여
update tests set name = ? where id = ?;
형태로 쿼리를 작성했다. setId에 null이 들어갔다. 이 경우 id가 어떤 경우 update가 될까? 만약 예상치 못한 레코드가 변경되는 것은 아닐까? - 아래와 같은 문제를 고려해봤다.
- id 칼럼이 null인 경우 동작한다.
- id 칼럼이 empty인 경우 동작한다.
- id 칼럼이 문자열 ‘null’인 경우 동작한다.
- db에서 예외를 던진다.
- 아래와 같이 테스트를 진행하였다.
create table tests(
seq int auto_increment primary key,
id varchar(100),
name varchar(100)
)
insert into tests (id, name) values
(null, 'kim'),
('null', 'kim'),
('', 'kim'),
('kim1234', 'kim');
-- affected 0
update tests
set name = 'new name'
where id = null
-- affected 0
update tests
set name = 'new name'
where id != null
-- affected 1
update tests
set name = 'new name'
where id is null
- 테스트 결과
where somecolumn = null
쿼리 자체가 동작하지 않았다. 그러니까 필터링 되는 값이 0개였다. - 처음 개발을 할 때
column is null
이 매우 불편하다고 생각했다. 지금 보면 매우 안전한 방식이다.where id = ?
으로 동적쿼리를 생성하는 과정에서 null을 입력할 수 있는 상황은 언제든 발생할 수 있다. 이러한 상황에서 ‘= null’ 과 ‘is null’을 통하여 null을 통제하는 방식은 사이드이펙트를 최소화 한다.