Beim Googeln scheint die beliebte Antwort " Schalten Sie einfach den abgesicherten Modus aus" zu sein :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Wenn ich ehrlich bin, kann ich nicht sagen, dass ich es mir jemals zur Gewohnheit gemacht habe, im abgesicherten Modus zu laufen. Trotzdem bin ich mit dieser Antwort nicht ganz zufrieden, da nur davon ausgegangen wird, dass Sie Ihre Datenbankkonfiguration jedes Mal ändern sollten, wenn Sie auf ein Problem stoßen.
Ihre zweite Abfrage befindet sich also näher an der Marke, stößt jedoch auf ein anderes Problem: MySQL wendet einige Einschränkungen auf Unterabfragen an. Eine davon ist, dass Sie eine Tabelle nicht ändern können, während Sie sie in einer Unterabfrage auswählen.
Zitat aus dem MySQL-Handbuch, Einschränkungen für Unterabfragen :
Im Allgemeinen können Sie eine Tabelle nicht ändern und in einer Unterabfrage aus derselben Tabelle auswählen. Diese Einschränkung gilt beispielsweise für Anweisungen der folgenden Formen:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Ausnahme: Das vorstehende Verbot gilt nicht, wenn Sie eine Unterabfrage für die geänderte Tabelle in der FROM-Klausel verwenden. Beispiel:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Hier wird das Ergebnis der Unterabfrage in der FROM-Klausel als temporäre Tabelle gespeichert, sodass die relevanten Zeilen in t zum Zeitpunkt der Aktualisierung auf t bereits ausgewählt wurden.
Das letzte bisschen ist deine Antwort. Wählen Sie Ziel-IDs in einer temporären Tabelle aus und löschen Sie sie, indem Sie auf die IDs in dieser Tabelle verweisen:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
SQLFiddle-Demo .