Tìm kiếm xung quanh, câu trả lời phổ biến dường như là "chỉ cần tắt chế độ an toàn" :
SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;
Nếu thành thật mà nói, tôi không thể nói rằng tôi đã từng tạo thói quen chạy ở chế độ an toàn. Tuy nhiên, tôi không hoàn toàn thoải mái với câu trả lời này vì nó chỉ giả định rằng bạn nên thay đổi cấu hình cơ sở dữ liệu của mình mỗi khi bạn gặp sự cố.
Vì vậy, truy vấn thứ hai của bạn gần với dấu hơn, nhưng lại gặp phải một vấn đề khác: MySQL áp dụng một số hạn chế cho các truy vấn con và một trong số đó là bạn không thể sửa đổi bảng trong khi chọn từ nó trong một truy vấn con.
Trích dẫn từ hướng dẫn sử dụng MySQL, Hạn chế về Truy vấn con :
Nói chung, bạn không thể sửa đổi bảng và chọn từ cùng một bảng trong một truy vấn con. Ví dụ: giới hạn này áp dụng cho các câu lệnh thuộc các dạng sau:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
Ngoại lệ: Điều cấm trước không áp dụng nếu bạn đang sử dụng truy vấn con cho bảng đã sửa đổi trong mệnh đề FROM. Thí dụ:
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Ở đây, kết quả từ truy vấn con trong mệnh đề FROM được lưu trữ dưới dạng bảng tạm thời, vì vậy các hàng có liên quan trong t đã được chọn vào thời điểm cập nhật thành t diễn ra.
Đó là chút cuối cùng là câu trả lời của bạn. Chọn các ID mục tiêu trong bảng tạm thời, sau đó xóa bằng cách tham chiếu các ID trong bảng đó:
DELETE FROM instructor WHERE id IN (
SELECT temp.id FROM (
SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
) AS temp
);
Bản trình diễn SQLFiddle .