테이블 강사가 있고 급여가 일정 범위에있는 레코드를 삭제하고 싶습니다. 직관적 인 방법은 다음과 같습니다.
delete from instructor where salary between 13000 and 15000;
하지만 안전 모드에서는 기본 키 (ID)를 제공하지 않으면 레코드를 삭제할 수 없습니다.
그래서 다음 SQL을 작성합니다.
delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
그러나 오류가 있습니다.
You can't specify target table 'instructor' for update in FROM clause
내가 쓸 때 혼란스러워
select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
오류가 발생하지 않습니다.
내 질문은 :
감사!
해결 방법
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
솔직히 말하면 안전 모드로 달리는 습관을 들였다고 말할 수 없습니다. 그래도 문제가 발생할 때마다 데이터베이스 구성을 변경해야한다고 가정하기 때문에이 답변에 완전히 익숙하지 않습니다.
따라서 두 번째 쿼리가 표시에 더 가깝지만 또 다른 문제가 발생합니다. MySQL은 하위 쿼리에 몇 가지 제한을 적용하고 그중 하나는 하위 쿼리에서 테이블을 선택하는 동안 테이블을 수정할 수 없다는 것입니다.
일반적으로 테이블을 수정하고 동일한 테이블에서 선택할 수 없습니다. in a subquery. For example, this limitation applies to statements of 다음 양식 :
DELETE FROM t WHERE ... (SELECT ... FROM t ...); UPDATE t ... WHERE col = (SELECT ... FROM t ...); {INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
예외 : FROM 절에서 수정 된 테이블에 대한 하위 쿼리를 사용하는 경우 앞의 금지 사항이 적용되지 않습니다. 예:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
여기서 FROM 절의 하위 쿼리 결과는 임시 테이블로 저장되므로 t에 대한 업데이트가 수행 될 때 t의 관련 행이 이미 선택되었습니다.
그 마지막 부분이 당신의 대답입니다. 임시 테이블에서 대상 ID를 선택한 다음 해당 테이블의 ID를 참조하여 삭제합니다.
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
참조 페이지 https://stackoverflow.com/questions/21841353
'MySql' 카테고리의 다른 글
MySQL 더 이상 사용되지 않음 : mysql_connect () (0) | 2020.12.10 |
---|---|
MySQL How to split comma separated text in MySQL stored procedure (0) | 2020.12.10 |
MySQL 오류 1115 (42000) : 알 수없는 문자 집합 : 'utf8mb4' (0) | 2020.12.10 |
MySQL Perl의 DBI에 PHP의 mysql_real_escape_string ()과 동등한 것이 있습니까? (0) | 2020.12.10 |
MySQL 여러 테이블에서 MySQL 삭제 행 (0) | 2020.12.10 |
댓글