IT TIP

안전 모드에서 mysql 삭제

itqueen 2020. 10. 22. 23:49
반응형

안전 모드에서 mysql 삭제


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

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);

오류가 발생하지 않습니다.

내 질문은 :

  1. 이 오류 메시지는 실제로 무엇을 의미하며 내 코드가 잘못된 이유는 무엇입니까?
  2. 이 코드를 안전 모드에서 작동하도록 다시 작성하는 방법은 무엇입니까?

감사!


인터넷 검색을하면 인기있는 대답은 "안전 모드를 끄십시오"입니다 .

SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;

솔직히 말하면 안전 모드로 달리는 습관을 들였다고 말할 수 없습니다. 그래도 문제가 발생할 때마다 데이터베이스 구성을 변경해야한다고 가정하기 때문에이 답변에 완전히 익숙하지 않습니다.

따라서 두 번째 쿼리가 표시에 더 가깝지만 또 다른 문제가 발생합니다. MySQL은 하위 쿼리에 몇 가지 제한을 적용하고 그중 하나는 하위 쿼리에서 테이블을 선택하는 동안 테이블을 수정할 수 없다는 것입니다.

MySQL 매뉴얼, Restrictions on Subqueries 에서 인용 :

일반적으로 테이블을 수정하고 하위 쿼리의 동일한 테이블에서 선택할 수 없습니다. 예를 들어,이 제한은 다음 형식의 문에 적용됩니다.

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
);

SQLFiddle 데모 .


MySQL을 속여 실제로 기본 키 열을 지정하고 있다고 생각할 수 있습니다. 이를 통해 안전 모드를 "무시"할 수 있습니다.

자동 증가 숫자 기본 키가있는 테이블이 있다고 가정하면 다음을 수행 할 수 있습니다.

DELETE FROM tbl WHERE id <> 0

Mysql Workbench 6.3.4.0에서 안전 모드 끄기

편집 메뉴 => 기본 설정 => SQL 편집기 : 기타 섹션 : "안전한 업데이트"를 클릭하십시오 ... 옵션을 선택 해제하려면

여기에 이미지 설명 입력


MySql 세션에 safe-updates 옵션이 설정되어있는 것 같습니다. 즉, where 절에 키 (예 : 기본 키)를 지정하지 않으면 레코드를 업데이트하거나 삭제할 수 없습니다.

시험

SET SQL_SAFE_UPDATES = 0;


나는 훨씬 더 간단한 해결책을 가지고 있으며 그것은 나를 위해 일하고 있습니다. 또한 해결 방법이지만 사용할 수 있으며 설정을 변경할 필요가 없습니다. 절대 존재하지 않는 값을 사용할 수 있다고 가정하고 WHERE 절에서 사용합니다.

MyField IS_NOT_EQUAL AnyValueNoItemOnMyFieldWillEverHave에서 MyTable에서 삭제

나는 그 해결책을 너무 좋아하지 않기 때문에 내가 여기에있는 이유이지만 작동하며 대답 된 것보다 더 좋아 보입니다.

참고 URL : https://stackoverflow.com/questions/21841353/mysql-delete-under-safe-mode

반응형