Google'da gezinirken, popüler yanıt "sadece güvenli modu kapat" gibi görünüyor :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Dürüst olursam, güvenli modda çalışmayı hiç alışkanlık haline getirdiğimi söyleyemem. Yine de, her sorunla karşılaştığınızda veritabanı yapılandırmanızı değiştirmeniz gerektiğini varsaydığı için bu yanıttan tamamen memnun değilim.
Bu nedenle, ikinci sorgunuz işarete daha yakın, ancak başka bir soruna çarpıyor: MySQL, alt sorgulara birkaç kısıtlama uyguluyor ve bunlardan biri, bir alt sorguda bir tabloyu seçerken bir tabloyu değiştirememenizdir.
MySQL kılavuzundan alıntı yapmak , Alt Sorgularla İlgili Kısıtlamalar :
Genel olarak, bir tabloyu değiştiremez ve bir alt sorudaki aynı tablodan seçim yapamazsınız. Örneğin, bu sınırlama aşağıdaki biçimlerdeki ifadeler için geçerlidir:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
İstisna: Önceki yasak, FROM yan tümcesinde değiştirilmiş tablo için bir alt sorgu kullanıyorsanız geçerli değildir. Misal:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Burada, FROM yan tümcesindeki alt sorgunun sonucu geçici bir tablo olarak saklanır, bu nedenle t'deki ilgili satırlar, t'ye güncelleme yapıldığında zaten seçilmiştir.
Bu son parça senin cevabın. Geçici bir tablodaki hedef kimlikleri seçin, ardından bu tablodaki kimlikleri referans alarak silin:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
SQLFiddle demosu .