안전 모드에서 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);
오류가 발생하지 않습니다.
내 질문은 :
- 이 오류 메시지는 실제로 무엇을 의미하며 내 코드가 잘못된 이유는 무엇입니까?
- 이 코드를 안전 모드에서 작동하도록 다시 작성하는 방법은 무엇입니까?
감사!
인터넷 검색을하면 인기있는 대답은 "안전 모드를 끄십시오"입니다 .
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
);
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
'IT TIP' 카테고리의 다른 글
Collectors.toMap () keyMapper — 더 간결한 표현? (0) | 2020.10.22 |
---|---|
"new String ()"도 변경 불가능합니까? (0) | 2020.10.22 |
Angular2-HTTP RequestOptions 헤더 (0) | 2020.10.22 |
Ruby의 문자열에서 특정 문자를 삭제하는 방법은 무엇입니까? (0) | 2020.10.22 |
Angular를 두 번 이상로드하려고했습니다. (0) | 2020.10.22 |