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

MySQL 오류 1093(HY000) 해결 방법 – FROM 절에서 업데이트 대상 테이블을 지정할 수 없다는 오류 없이 열의 최솟값 삭제하기

오류 1093(HY000): FROM 절에서 업데이트 대상 테이블을 지정할 수 없습니다

MySQL에서는 DELETE나 UPDATE로 테이블을 수정하는 동안 같은 테이블을 서브쿼리에서 직접 참조하면 오류 1093 (HY000)이 발생합니다. 이 오류를 해결하는 핵심은 서브쿼리를 별칭이 있는 파생 테이블(derived table)로 한 번 더 감싸는 것입니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 테이블을 생성합니다.

mysql> create table DemoTable1597
    -> (
    -> Marks int
    -> );
Query OK, 0 rows affected (0.69 sec)

2단계: 레코드 삽입

insert 명령을 사용하여 테이블에 레코드를 삽입합니다.

mysql> insert into DemoTable1597 values(45);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1597 values(59);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable1597 values(43);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1597 values(85);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1597 values(89);
Query OK, 1 row affected (0.12 sec)

3단계: 전체 레코드 조회

select 문을 사용하여 테이블의 모든 레코드를 확인합니다.

mysql> select * from DemoTable1597;

위 쿼리는 다음과 같은 결과를 출력합니다.

+-------+
| Marks |
+-------+
|    45 |
|    59 |
|    43 |
|    85 |
|    89 |
+-------+
5 rows in set (0.00 sec)

4단계: 오류 없이 최솟값 삭제하기

다음은 오류 1093(HY000)을 피하면서 최솟값을 삭제하는 쿼리입니다. min(Marks)을 계산하는 서브쿼리를 별칭(deleteRecord)이 있는 파생 테이블로 감싸면, MySQL이 이 서브쿼리를 임시 테이블로 처리하기 때문에 동일 테이블 참조 제한을 우회할 수 있습니다.

mysql> delete from DemoTable1597
    -> where Marks=(
    -> select lowestMarks from ( select min(Marks) as lowestMarks from DemoTable1597 ) as deleteRecord
    -> ) limit 1;
Query OK, 1 row affected (0.11 sec)

5단계: 삭제 결과 확인

테이블을 다시 조회하여 레코드가 정상적으로 삭제되었는지 확인합니다.

mysql> select * from DemoTable1597;

위 쿼리는 다음과 같은 결과를 출력합니다. 가장 낮은 값인 43이 성공적으로 삭제된 것을 확인할 수 있습니다.

+-------+
| Marks |
+-------+
|    45 |
|    59 |
|    85 |
|    89 |
+-------+
4 rows in set (0.00 sec)

이처럼 서브쿼리를 파생 테이블로 감싸는 기법을 활용하면, DELETE 또는 UPDATE 대상 테이블을 서브쿼리에서 참조해야 하는 상황에서도 오류 1093 없이 안전하게 작업을 처리할 수 있습니다. limit 1을 함께 사용하면 조건에 해당하는 행 중 하나만 삭제되므로 의도하지 않은 대량 삭제도 예방할 수 있습니다.