En cherchant sur Google, la réponse la plus populaire semble être "il suffit de désactiver le mode sans échec" :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Si je suis honnête, je ne peux pas dire que j'ai déjà pris l'habitude de fonctionner en mode sans échec. Pourtant, je ne suis pas tout à fait à l'aise avec cette réponse car elle suppose simplement que vous devriez changer la configuration de votre base de données chaque fois que vous rencontrez un problème.
Ainsi, votre deuxième requête est plus proche de la marque, mais rencontre un autre problème: MySQL applique quelques restrictions aux sous-requêtes, et l'une d'elles est que vous ne pouvez pas modifier une table en la sélectionnant dans une sous-requête.
Citant le manuel MySQL, Restrictions sur les sous - requêtes :
En général, vous ne pouvez pas modifier une table et sélectionner à partir de la même table dans une sous-requête. Par exemple, cette limitation s'applique aux instructions des formes suivantes:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Exception: l'interdiction précédente ne s'applique pas si vous utilisez une sous-requête pour la table modifiée dans la clause FROM. Exemple:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Ici, le résultat de la sous-requête dans la clause FROM est stocké en tant que table temporaire, de sorte que les lignes pertinentes de t ont déjà été sélectionnées au moment où la mise à jour vers t a lieu.
Ce dernier élément est votre réponse. Sélectionnez les ID cibles dans une table temporaire, puis supprimez en référençant les ID de cette table:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Démo SQLFiddle .