MySQL UPDATE 쿼리로 최대 ID 행만 수정하기
MySQL에서 특정 조건에 해당하는 여러 행 중 가장 큰(최신) ID를 가진 단 하나의 행만 업데이트해야 하는 경우가 있습니다. 이럴 때는 UPDATE 문에 ORDER BY 절과 LIMIT 절을 함께 사용하면 간단하게 해결할 수 있습니다.
기본 문법
기본적인 쿼리 형식은 다음과 같습니다.
UPDATE 테이블명
SET 컬럼명1 = 변경할값
WHERE 컬럼명2 = 조건값
ORDER BY ID컬럼명 DESC
LIMIT 1;
ORDER BY ... DESC로 ID가 가장 큰 행부터 정렬한 뒤, LIMIT 1로 첫 번째 행 한 개만 업데이트하는 원리입니다.
예제 테이블 생성
실습을 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table UpdateWithHighestDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserStatus tinyint,
-> UserRank int
-> );
Query OK, 0 rows affected (0.61 sec)
UserId는 자동 증가(AUTO_INCREMENT) 기본키이고, 사용자 상태를 나타내는 UserStatus와 순위를 나타내는 UserRank 컬럼으로 구성되어 있습니다.
샘플 데이터 삽입
INSERT 명령어로 몇 개의 레코드를 추가합니다.
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,78);
Query OK, 1 row affected (0.12 sec)
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,118);
Query OK, 1 row affected (0.18 sec)
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,223);
Query OK, 1 row affected (0.62 sec)
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,225);
Query OK, 1 row affected (0.12 sec)
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,227);
Query OK, 1 row affected (0.14 sec)
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,230);
Query OK, 1 row affected (0.17 sec)
전체 데이터 조회
SELECT 문으로 저장된 모든 레코드를 확인해 보겠습니다.
mysql> select *from UpdateWithHighestDemo;
실행 결과는 다음과 같습니다.
+--------+------------+----------+
| UserId | UserStatus | UserRank |
+--------+------------+----------+
| 1 | 1 | 78 |
| 2 | 0 | 118 |
| 3 | 1 | 223 |
| 4 | 1 | 225 |
| 5 | 0 | 227 |
| 6 | 0 | 230 |
+--------+------------+----------+
6 rows in set (0.00 sec)
조건에 맞는 행 업데이트하기
이제 UserRank가 230인 행의 UserStatus를 1로 변경해 보겠습니다.
mysql> update UpdateWithHighestDemo
-> set UserStatus=1 where UserRank=230 order by UserId DESC LIMIT 1;
Query OK, 1 row affected (0.19 sec)
Rows matched: 1 Changed: 1 Warnings: 0
변경된 결과를 다시 조회해 확인합니다.
mysql> select *from UpdateWithHighestDemo;
+--------+------------+----------+
| UserId | UserStatus | UserRank |
+--------+------------+----------+
| 1 | 1 | 78 |
| 2 | 0 | 118 |
| 3 | 1 | 223 |
| 4 | 1 | 225 |
| 5 | 0 | 227 |
| 6 | 1 | 230 |
+--------+------------+----------+
6 rows in set (0.00 sec)
UserId가 6인 행의 UserStatus가 0에서 1로 정상적으로 변경된 것을 확인할 수 있습니다.
가장 큰 ID를 가진 행 업데이트하기
WHERE 조건 없이 테이블 전체에서 ID가 가장 큰 행 하나만 업데이트하고 싶다면 ORDER BY 절이 특히 유용합니다. 위 예제에서 가장 큰 UserId는 6이며, 현재 UserStatus는 1입니다. 이 값을 0으로 바꿔 보겠습니다.
mysql> update UpdateWithHighestDemo
-> set UserStatus=0 order by UserId DESC LIMIT 1;
Query OK, 1 row affected (0.18 sec)
Rows matched: 1 Changed: 1 Warnings: 0
최종 결과를 SELECT 문으로 확인합니다.
mysql> select *from UpdateWithHighestDemo;
+--------+------------+----------+
| UserId | UserStatus | UserRank |
+--------+------------+----------+
| 1 | 1 | 78 |
| 2 | 0 | 118 |
| 3 | 1 | 223 |
| 4 | 1 | 225 |
| 5 | 0 | 227 |
| 6 | 0 | 230 |
+--------+------------+----------+
6 rows in set (0.00 sec)
정리
MySQL에서 조건에 맞는 행 중 가장 큰 ID를 가진 행만 업데이트하려면 다음 두 가지를 기억하면 됩니다.
- ORDER BY ID컬럼 DESC: ID가 큰 순서대로 정렬
- LIMIT 1: 정렬 결과 중 첫 번째 행(=ID가 가장 큰 행) 한 개만 적용
이 방식은 WHERE 절 유무와 관계없이 동작하므로, 조건부 업데이트와 최신 데이터 업데이트 모두에 활용할 수 있습니다.