MySQL에서 UPDATE 쿼리에 LIMIT을 사용할 수 있을까?
결론부터 말하면 가능합니다. MySQL에서는 UPDATE 쿼리에 LIMIT을 함께 사용하여 특정 개수의 행만 업데이트할 수 있습니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 예제용 테이블 생성하기
먼저 CREATE 명령어를 사용해 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE tblUpdateLimit -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.53 sec)
2. 데이터 삽입하기
INSERT 명령어를 이용해 총 9개의 레코드를 테이블에 추가합니다.
mysql> INSERT INTO tblUpdateLimit VALUES(1,'John'); Query OK, 1 row affected (0.54 sec) mysql> INSERT INTO tblUpdateLimit VALUES(2,'Carol'); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO tblUpdateLimit VALUES(3,'Smith'); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO tblUpdateLimit VALUES(4,'Kayle'); Query OK, 1 row affected (0.44 sec) mysql> INSERT INTO tblUpdateLimit VALUES(5,'David'); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO tblUpdateLimit VALUES(6,'Jason'); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO tblUpdateLimit VALUES(7,'Larry'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO tblUpdateLimit VALUES(8,'Serhat'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO tblUpdateLimit VALUES(9,'Winny'); Query OK, 1 row affected (0.18 sec)
3. 테이블 데이터 확인하기
저장된 데이터를 조회하려면 다음 쿼리를 실행합니다.
mysql> SELECT * FROM tblUpdateLimit;
실행 결과는 아래와 같습니다.
+------+--------+ | id | name | +------+--------+ | 1 | John | | 2 | Carol | | 3 | Smith | | 4 | Kayle | | 5 | David | | 6 | Jason | | 7 | Larry | | 8 | Serhat | | 9 | Winny | +------+--------+ 9 rows in set (0.00 sec)
4. LIMIT과 함께 사용하는 UPDATE 문법
UPDATE 쿼리에 LIMIT을 적용하려면 서브쿼리를 활용하는 방식을 사용합니다. 기본 문법은 다음과 같습니다.
UPDATE yourTableName SET column_name='some value' WHERE column_name1 IN ( SELECT column_name1 FROM ( SELECT column_name1 FROM yourTableName ORDER BY column_name1 ASC LIMIT integerValue, integerValue ) anyAliasName );
이 문법의 핵심은 내부 서브쿼리에서 먼저 원하는 범위의 행을 선택한 뒤, 외부 WHERE 조건에서 해당 행들을 업데이트 대상으로 지정하는 것입니다.
5. 실제 쿼리 실행하기
이제 위 문법을 실제로 적용해 보겠습니다. id 기준 오름차순으로 정렬했을 때 앞의 7개 행의 name 값을 'Adam'으로 변경하는 쿼리입니다.
mysql> UPDATE tblUpdateLimit SET name = 'Adam' -> WHERE id IN ( SELECT id FROM ( SELECT id FROM tblUpdateLimit ORDER BY id ASC LIMIT 0,7 ) l); Query OK, 7 rows affected (0.27 sec) Rows matched: 7 Changed: 7 Warnings: 0
실행 결과를 보면 7개의 행이 성공적으로 변경되었음을 확인할 수 있습니다.
6. 업데이트 결과 검증하기
테이블이 제대로 업데이트되었는지 다시 조회해 보겠습니다.
mysql> SELECT * FROM tblUpdateLimit;
출력 결과는 다음과 같습니다.
+------+--------+ | id | name | +------+--------+ | 1 | Adam | | 2 | Adam | | 3 | Adam | | 4 | Adam | | 5 | Adam | | 6 | Adam | | 7 | Adam | | 8 | Serhat | | 9 | Winny | +------+--------+ 9 rows in set (0.00 sec)
id가 1부터 7까지인 행의 name이 모두 'Adam'으로 변경되고, 나머지 두 행은 그대로 유지된 것을 확인할 수 있습니다.
참고: 단일 테이블 업데이트라면 더 간단한 방법도 있습니다
참고로 MySQL은 단일 테이블 UPDATE 구문에서 ORDER BY와 LIMIT를 직접 지원합니다. 즉, 위 예제처럼 서브쿼리 없이도 아래와 같이 작성할 수 있습니다.
UPDATE tblUpdateLimit SET name = 'Adam' ORDER BY id ASC LIMIT 7;
다만 여러 테이블을 조인하는 UPDATE나 특정 환경(예: 안전 업데이트 모드)에서는 서브쿼리 방식이 필요할 수 있으므로, 상황에 맞게 두 가지 방법을 활용하시면 됩니다.