UPDATE 문의 SET 절에서 새로운 값을 할당하기 위해 서브쿼리(subquery)를 사용할 때, 해당 서브쿼리는 WHERE 조건과 일치하는 업데이트 대상 테이블의 각 행마다 정확히 하나의 행만 반환해야 합니다. 만약 서브쿼리가 두 개 이상의 행을 반환하면, MySQL은 다음과 같은 오류 메시지를 출력합니다.
예시
먼저 'info' 테이블에 데이터를 추가하고 전체 내용을 확인해 보겠습니다.
mysql> insert into info(id, remarks) values(5,'average'); Query OK, 1 row affected (0.06 sec) mysql> select * from info; +------+-----------+ | id | remarks | +------+-----------+ | 1 | Good | | 2 | Good | | 3 | Excellent | | 4 | Average | | 5 | Best | | 5 | average | +------+-----------+ 6 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이 'info' 테이블에는 id = 5인 행이 두 개 존재합니다. 이 상태에서 해당 테이블을 서브쿼리로 사용하여 STUDENT 테이블을 업데이트하면, 서브쿼리가 여러 개의 행을 반환하게 되어 MySQL은 아래와 같은 오류 메시지를 출력합니다.
mysql> UPDATE STUDENT SET grade = (SELECT remarks from info WHERE info.id = student.id) WHERE id = 5; ERROR 1242 (21000): Subquery returns more than 1 row
오류 의미와 해결 방법
ERROR 1242 (Subquery returns more than 1 row)는 단일 값을 기대하는 위치(SET 절의 할당 값)에서 서브쿼리가 둘 이상의 행을 반환했음을 의미합니다. 이러한 오류를 방지하려면 다음과 같은 방법을 활용할 수 있습니다.
- 집계 함수 사용:
MAX(),MIN(),LIMIT등을 활용해 결과를 반드시 하나의 값으로 제한합니다. 예:(SELECT MAX(remarks) FROM info WHERE info.id = student.id) - 조건 보완: 서브쿼리의 WHERE 조건을 더 구체적으로 수정하여 중복 행이 반환되지 않도록 합니다.
- 데이터 정합성 확보: 'info' 테이블처럼 동일한 id가 중복되는 경우, 기본 키(PK)나 유니크 인덱스를 설정하여 애초에 중복 데이터가 입력되지 않도록 설계하는 것이 근본적인 해결책입니다.