W wyszukiwarce Google popularną odpowiedzią wydaje się być „po prostu wyłącz tryb awaryjny” :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Szczerze mówiąc, nie mogę powiedzieć, żebym kiedykolwiek miał w zwyczaju biegać w trybie awaryjnym. Mimo to nie jestem do końca zadowolony z tej odpowiedzi, ponieważ zakłada ona po prostu, że powinieneś zmieniać konfigurację bazy danych za każdym razem, gdy napotkasz problem.
Zatem twoje drugie zapytanie jest bliżej znaku, ale napotyka inny problem: MySQL nakłada kilka ograniczeń na podzapytania, a jednym z nich jest to, że nie możesz modyfikować tabeli podczas wybierania jej w podzapytaniu.
Cytowanie z podręcznika MySQL, Restrictions on Subqueries :
Zasadniczo nie można modyfikować tabeli i wybierać z tej samej tabeli w podzapytaniu. Na przykład to ograniczenie dotyczy oświadczeń w następujących formach:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Wyjątek: powyższy zakaz nie ma zastosowania, jeśli używasz podzapytania dla zmodyfikowanej tabeli w klauzuli FROM. Przykład:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Tutaj wynik z podzapytania w klauzuli FROM jest przechowywany jako tabela tymczasowa, więc odpowiednie wiersze w t zostały już wybrane przed dokonaniem aktualizacji do t.
Ta ostatnia odpowiedź to twoja odpowiedź. Wybierz identyfikatory docelowe w tabeli tymczasowej, a następnie usuń, odwołując się do identyfikatorów w tej tabeli:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Demo SQLFiddle .