MySQL의 UPDATE 문에서 WHERE 절의 조건과 일치하는 행이라면, SET 절에 새로운 값을 지정할 때 해당 행의 기존 값을 그대로 활용할 수 있습니다. 즉, 기존 열 값을 기반으로 산술 연산 등을 수행한 결과를 새로운 값으로 저장하는 것이 가능합니다. 다음 예제를 통해 구체적인 동작 방식을 살펴보겠습니다.
예제
먼저 다음과 같은 'tender'라는 이름의 테이블이 있다고 가정해 보겠습니다.
mysql> Select * from tender; +-----------+---------+------+ | tender_id | company | rate | +-----------+---------+------+ | 200 | ABC | 1000 | | 300 | ABD | 6000 | | 301 | ABE | 7000 | | 302 | ABF | 3500 | | 303 | ABG | 3600 | +-----------+---------+------+ 5 rows in set (0.00 sec)
아래 쿼리는 tender_id 열의 값을 100씩 증가시키는 동시에, 변경된 tender_id 값에 500을 더한 값으로 'rate' 열을 함께 업데이트합니다. 이때 WHERE 절에 의해 업데이트 대상은 tender_id가 300보다 큰 행으로 제한됩니다.
mysql> UPDATE tender SET tender_id = tender_id + 100, rate = tender_id + 500 Where tender_id > 300; Query OK, 3 rows affected (0.06 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> Select * from tender; +-----------+----------+------+ | tender_id | company | rate | +-----------+----------+------+ | 200 | ABC | 1000 | | 300 | ABD | 5000 | | 401 | ABE | 901 | | 402 | ABF | 902 | | 403 | ABG | 903 | +-----------+----------+------+ 5 rows in set (0.00 sec)
결과 분석
실행 결과에서 주목할 점은 rate 열의 값입니다. 예를 들어 원래 tender_id가 301이던 행은 401로 변경되었고, rate 값은 901이 되었습니다. 이는 곧 401(변경된 tender_id) + 500의 계산 결과입니다.
이런 결과가 나오는 이유는 MySQL이 SET 절의 할당식을 왼쪽에서 오른쪽으로 순차적으로 처리하기 때문입니다. 따라서 rate = tender_id + 500이 평가되는 시점에는 tender_id가 이미 100만큼 증가된 값으로 갱신된 상태이며, 연산에는 이 갱신된 값이 사용됩니다.
반면 WHERE 조건(tender_id > 300)에 해당하지 않는 행은 업데이트에서 제외되며, 실행 결과의 "Rows matched: 3 Changed: 3"에서 알 수 있듯이 실제로 변경된 행은 3개뿐입니다. 이처럼 UPDATE 문의 SET 절에서 기존 값을 활용하면 별도의 서브쿼리나 애플리케이션 로직 없이도 한 번의 쿼리로 여러 열의 값을 효율적으로 갱신할 수 있습니다.