Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL UPDATE 문의 SET 절에서 행의 기존 값을 활용해 새로운 값을 설정하는 방법

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 절에서 기존 값을 활용하면 별도의 서브쿼리나 애플리케이션 로직 없이도 한 번의 쿼리로 여러 열의 값을 효율적으로 갱신할 수 있습니다.