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

MySQL에서 중복 ID를 가진 행 업데이트하기 – ORDER BY와 LIMIT 활용법

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 ... DESCLIMIT 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)나 고유 인덱스를 설정하는 것이 좋습니다.