MySQL에서 동일한 ID가 여러 개 존재할 때, 그중 특정 한 행만 골라서 업데이트해야 하는 경우가 있습니다. 이럴 때는 UPDATE 문에 ORDER BY 절과 LIMIT 1을 함께 사용하면 원하는 행 하나만 정확하게 수정할 수 있습니다.
기본 문법
중복된 값 중 조건에 맞는 행 하나만 업데이트하는 기본 문법은 다음과 같습니다.
update yourTableName set yourColumnName1=yourValue where yourColumnName2=yourValue order by yourColumnName2 DESC limit 1;
예제 테이블 생성하기
먼저 실습용 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.61 sec)샘플 데이터 삽입
insert 명령으로 몇 개의 레코드를 추가합니다. 여기서는 의도적으로 Id=2인 데이터를 세 개 넣어 중복 상황을 만들었습니다.
mysql> insert into DemoTable values(1,'John'); Query OK, 1 row affected (0.41 sec) mysql> insert into DemoTable values(2,'Chris'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(2,'Robert'); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(2,'David'); Query OK, 1 row affected (0.18 sec)
현재 데이터 확인
select 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+------+--------+ | Id | Name | +------+--------+ | 1 | John | | 2 | Chris | | 2 | Robert | | 2 | David | +------+--------+ 4 rows in set (0.00 sec)
보시는 것처럼 Id=2인 행이 세 개 존재합니다.
중복 ID 중 마지막 행 하나만 업데이트하기
이제 ORDER BY ... DESC와 LIMIT 1을 사용해 Id=2인 행 중 마지막(가장 아래) 행의 Name 값을 'Adam Smith'로 변경해 보겠습니다.
mysql> update DemoTable set Name='Adam Smith' where Id=2 order by Id DESC limit 1; Query OK, 1 row affected (0.28 sec) Rows matched: 1 Changed: 1 Warnings: 0
'Rows matched: 1, Changed: 1'이라는 메시지를 통해 단 한 개의 행만 수정되었음을 확인할 수 있습니다.
업데이트 후 데이터 확인
다시 select 문으로 테이블을 조회해 결과를 검증해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+------+------------+ | Id | Name | +------+------------+ | 1 | John | | 2 | Adam Smith | | 2 | Robert | | 2 | David | +------+------------+ 4 rows in set (0.00 sec)
정리 및 주의 사항
결과를 보면 Id=2인 행 중 'Chris'가 'Adam Smith'로 변경되었습니다. MySQL은 내부적으로 WHERE 조건에 일치하는 행들을 스캔하며, ORDER BY Id DESC 정렬 순서에 따라 첫 번째로 만나는 행에 LIMIT 1이 적용되어 해당 행만 업데이트됩니다.
참고로 UPDATE ... ORDER BY ... LIMIT 구문은 MySQL에서 지원하는 기능이며, PostgreSQL이나 SQL Server 등 다른 DBMS에서는 동작하지 않으므로 주의해야 합니다. 또한 중복 ID가 허용되는 테이블 구조는 데이터 무결성 측면에서 권장되지 않으므로, 가능하다면 기본 키(PRIMARY KEY)나 고유 인덱스를 설정하는 것이 좋습니다.