Bạn không thể xóa các bản ghi theo cách đó, vấn đề chính là bạn không thể sử dụng truy vấn con để chỉ định giá trị của mệnh đề LIMIT.
Điều này hoạt động (được thử nghiệm trong MySQL 5.0.67):
DELETE FROM `table`
WHERE id NOT IN (
SELECT id
FROM (
SELECT id
FROM `table`
ORDER BY id DESC
LIMIT 42 -- keep this many records
) foo
);
Truy vấn con trung gian là cần thiết. Nếu không có nó, chúng tôi sẽ gặp phải hai lỗi:
- Lỗi SQL (1093):Bạn không thể chỉ định bảng mục tiêu 'bảng' để cập nhật trong mệnh đề FROM - MySQL không cho phép bạn tham chiếu đến bảng bạn đang xóa trong một truy vấn con trực tiếp.
- Lỗi SQL (1235):Phiên bản MySQL này chưa hỗ trợ 'LIMIT &IN / ALL / ANY / SOME truy vấn con' - Bạn không thể sử dụng mệnh đề LIMIT trong truy vấn con trực tiếp của toán tử NOT IN.
May mắn thay, việc sử dụng truy vấn con trung gian cho phép chúng tôi bỏ qua cả hai hạn chế này.
Nicole đã chỉ ra rằng truy vấn này có thể được tối ưu hóa đáng kể cho các trường hợp sử dụng nhất định (chẳng hạn như trường hợp này). Tôi khuyên bạn nên đọc câu trả lời đó cũng như để xem liệu nó có phù hợp với bạn không.