MySQL UPDATE 문의 SET 절에서 컬럼 순서가 중요한 이유
MySQL에서 UPDATE 문의 SET 절에 나열되는 컬럼 순서가 중요한 이유는, 표현식(expression) 내에서 참조되는 컬럼 이름에 대해 MySQL이 이미 갱신된 값을 사용하기 때문입니다. 즉, SET 절에서 먼저 처리된 컬럼의 새로운 값이 이후 표현식에 그대로 반영됩니다. 따라서 컬럼 순서를 바꾸면 MySQL이 반환하는 결과 집합에 큰 차이가 발생할 수 있습니다.
다음 예제를 통해 구체적으로 살펴보겠습니다.
예제 준비: 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)
예제 1: tender_id를 먼저 갱신하는 경우
SET 절에 tender_id를 첫 번째로, rate를 두 번째로 지정하여 UPDATE 문을 실행합니다.
mysql> UPDATE tender SET tender_id = tender_id + 100, rate = tender_id * 4 WHERE tender_id = 200; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0
이 쿼리는 먼저 tender_id 값을 갱신한 뒤, 변경된 새로운 tender_id 값을 기준으로 rate를 계산합니다. 실행 결과는 다음과 같습니다.
mysql> Select * from tender; +-----------+---------+------+ | tender_id | company | rate | +-----------+---------+------+ | 300 | ABC | 1200 | | 300 | ABD | 6000 | | 301 | ABE | 7000 | | 302 | ABF | 3500 | | 303 | ABG | 3600 | +-----------+---------+------+ 5 rows in set (0.00 sec)
tender_id가 200에서 300으로 변경되었고, rate 역시 새로운 tender_id인 300 × 4 = 1200으로 갱신된 것을 확인할 수 있습니다.
예제 2: rate를 먼저 갱신하는 경우
이번에는 SET 절에 rate를 첫 번째로, tender_id를 두 번째로 지정해 보겠습니다.
mysql> UPDATE tender SET rate = tender_id * 4, tender_id = tender_id + 200 WHERE company = 'ABD'; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0
이 쿼리는 먼저 기존(갱신 전) tender_id 값을 기준으로 rate를 계산한 후, 그다음 tender_id 값을 갱신합니다. 실행 결과는 다음과 같습니다.
mysql> Select * from tender; +-----------+---------+------+ | tender_id | company | rate | +-----------+---------+------+ | 300 | ABC | 1200 | | 500 | ABD | 1200 | | 301 | ABE | 7000 | | 302 | ABF | 3500 | | 303 | ABG | 3600 | +-----------+---------+------+ 5 rows in set (0.00 sec)
rate는 기존 tender_id였던 300 × 4 = 1200으로 계산되었고, 이후 tender_id만 500으로 변경된 것을 볼 수 있습니다.
결론
이처럼 SET 절에서 컬럼의 순서만 바꿔도 출력 결과가 완전히 달라질 수 있습니다. UPDATE 문에서 여러 컬럼을 동시에 갱신하면서 한 표현식이 다른 컬럼의 값을 참조하는 경우에는, 반드시 갱신 순서를 신중하게 고려해야 의도한 결과를 얻을 수 있습니다.