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

MySQL UPDATE문의 SET 절에서 서브쿼리가 여러 행을 반환하면 어떻게 될까?

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)나 유니크 인덱스를 설정하여 애초에 중복 데이터가 입력되지 않도록 설계하는 것이 근본적인 해결책입니다.