ERROR #1093 : FROM 절에서 업데이트 대상 테이블 table_name을 지정할 수 없습니다.

3604 단어 mysql
이 블로그에서는 하나의 MySQL 질문을 해결하고 문제를 해결하면서 오류를 이해합니다.

문제 :
중복 이메일 삭제

표: 사람

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+


id는 이 테이블의 기본 키 열입니다.
이 테이블의 각 행에는 이메일이 포함되어 있습니다. 이메일에는 대문자가 포함되지 않습니다.

가장 작은 ID를 가진 하나의 고유한 이메일만 유지하면서 모든 중복 이메일을 삭제하는 SQL 쿼리를 작성합니다.

입력:
개인 테이블:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+


산출:

+----+------------------+
| id | email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+


설명: [email protected]이 두 번 반복됩니다. 가장 작은 Id = 1인 행을 유지합니다.

동일한 이메일을 가지고 있는 개수를 알고 싶다면 GROUP BY 방식을 사용해야 합니다.

GROUP BY 문은 "각 이메일에서 ID 번호 찾기"와 같이 동일한 값을 가진 행을 요약 행으로 그룹화합니다.

GROUP BY 문은 종종 집계 함수(COUNT(), MAX(), MIN(), SUM(), AVG())와 함께 사용되어 결과 집합을 하나 이상의 열로 그룹화합니다.



여기에서 동일한 이메일을 가진 각 행을 그룹화하고 COUNT() 함수를 사용하여 행 수를 찾습니다. 이메일[email protected]은 두 번 발생하므로 2로 계산되고 [email protected]은 한 번만 발생하므로 1로 계산됩니다.

여기 이메일[email protected]에는 두 개의 ID 1과 3이 있습니다. 이 두 ID에서 최소 ID를 얻거나 어떤 번호에서 최소 ID를 얻으려면. 특정 이메일에 대한 ID의 경우 MIN() 함수를 사용해야 합니다.

MySQL 쿼리는 다음과 같아야 합니다.



여기에서 min(1,3)이 1이어야 하기 때문에 이메일[email protected]에 대해 ID 1을 얻고 MIN() 함수에서 반환되어야 하는 ID가 하나만 있기 때문에 [email protected]에 대해 2를 얻습니다.

이제 우리는 이 문제에서 주요 작업을 완료했습니다. 우리는 테이블에서 가장 작은 id를 유지하고 동일한 이메일을 가진 작은 id보다 큰 모든 id를 삭제하기를 원하기 때문에 이 최소 id에 없는 id만 원합니다. 따라서 우리는 먼저 동일한 이메일을 가진 행을 그룹화한 다음 그 중에서 가장 작은 id를 찾아 테이블에서 가장 작은 id를 유지하고 id > small(id)인 동일한 이메일을 가진 모든 행을 삭제합니다.

따라서 쿼리는 특정 이메일의 가장 작은 ID와 같지 않은 모든 ID를 삭제합니다.



이런...
오류가 발생했습니다.

ERROR #1093 : FROM 절의 업데이트에 대한 대상 테이블 table_name을 지정할 수 없습니다.

쿼리를 아래와 같이 변경하면 됩니다.



자, 여기서 마법이 어떻게 일어나는지 설명하겠습니다.

하위 쿼리가 참조하는 동일한 데이터 소스에서 행을 삭제할 수 없습니다. 위에서 언급한 이 쿼리는 작동하지만 성능을 비롯한 여러 가지 이유로 좋지 않습니다. 여기서 중첩 하위 쿼리는 임시 테이블을 만듭니다. 따라서 데이터를 삭제하려는 동일한 테이블로 간주되지 않습니다.

업데이트가 주기적일 수 있기 때문입니다. 해당 레코드를 업데이트하면 WHERE 조건이 FALSE가 되는 일이 발생하면 어떻게 됩니까? 그렇지 않다는 것을 알고 있지만 엔진은 그렇지 않습니다. 작업 중에 테이블에 반대 잠금이 있을 수도 있습니다.

좋은 웹페이지 즐겨찾기