본문 바로가기
Develop/CS

[DB] update set에서 주의할 점

by 연로그 2023. 11. 19.
반응형

최근 update 쿼리를 짜면서 겪었던 실수를 공유해보려고 한다.

일단 간단한 테스트 데이터를 준비해보았다.

insert into test_menu (name, price, deleted)
values ('  커피  ', 5000, 0);

 

여기서 name의 앞뒤에 공백이 들어간 데이터들에 대해 update 작업을 실행하려고 한다.

아래는 name은 trim 처리하고, price를 1000으로 변경하는 쿼리이다.

update test_menu
set name = trim(name) and price = 1000
where name like ' %'
   or name like '% ';

 

하지만 실제 결과를 보면 뭔가 이상하다. 

name에는 0이라는 값이 들어갔고, price는 변경되지 않았다.

 

당연한 이야기다. 왜냐하면 잘못된 쿼리이니까! and는 여러 조건을 나열하는 것이 아니라 조건을 비교하는 연산자이다. '조건1 and 조건2'라면 조건1이 true이고, 조건2도 true여야 결과가 true로 나온다. 위 쿼리에서 name = trim(name) and price = 1000의 연산 결과가 false이기 때문에 0이라는 값이 저장되었던 것이다.

 

내가 의도했던대로 name에는 trim된 값을 저장하고, price에는 1000을 저장하고 싶었다면 아래와 같이 작성해야했다.

update test_menu
set name = trim(name), price = 1000
where name like ' %'
   or name like '% ';

 

정말 간단하면서도 어이없는 실수였다.😅 개발 서버에서 실행만 해보고 문제 없나보다하고 넘겼는데 하마터면 큰일날 뻔했다. 이 일을 통해 새삼 중요하다고 깨닫게 된 점은 총 세가지 정도이다.

 

  1. 업데이트 쿼리는 테스트를 꼼꼼하게 하자.
  2. 쿼리를 통해 변경될 범위를 미리 파악하고, 원본 데이터를 백업해두자. 
  3. bulk update 쿼리는 지양하자. 반드시 pk로 조회해서 수정하자.
반응형