본문 바로가기
MySql

MySQL 안전 모드에서 mysql 삭제

by 베이스 공부 2020. 12. 10.
반응형

테이블 강사가 있고 급여가 일정 범위에있는 레코드를 삭제하고 싶습니다. 직관적 인 방법은 다음과 같습니다.

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

 

 

반응형

댓글