MySQL không hỗ trợ DELETE ... LIMIT 1 OFFSET n trực tiếp (trước 8.0). Cách phổ biến: dùng subquery lấy ID của hàng thứ n, rồi DELETE theo ID.
Ví dụ minh họa
Tạo bảng:
CREATE TABLE DemoTable1 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(100)
);
INSERT INTO DemoTable1 (StudentName) VALUES
('Larry'), ('Sam'), ('Mike'), ('Carol'), ('David'), ('Bob');
Dữ liệu (6 hàng):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Larry | | 2 | Sam | | 3 | Mike | | 4 | Carol | | 5 | David | | 6 | Bob | +-----------+-------------+
Xóa hàng thứ 2 (theo thứ tự StudentId):
DELETE FROM DemoTable1
WHERE StudentId = (
SELECT StudentId FROM (
SELECT StudentId FROM DemoTable1 ORDER BY StudentId LIMIT 1, 1
) AS tbl
);
Kết quả (hàng Sam bị xóa):
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Larry | | 3 | Mike | | 4 | Carol | | 5 | David | | 6 | Bob | +-----------+-------------+
Giải thích:
- Subquery trong
FROM(SELECT ... LIMIT 1, 1) lấy hàng thứ 2 (offset 1, limit 1). - Bọc thêm một lớp subquery (
AS tbl) vì MySQL không cho phép UPDATE/DELETE cùng bảng với subquery trực tiếp (trừ khi dùng derived table). ORDER BY StudentIdxác định thứ tự "hàng thứ n".
MySQL 8.0+: Hỗ trợ DELETE ... ORDER BY ... LIMIT n OFFSET m trực tiếp:
DELETE FROM DemoTable1 ORDER BY StudentId LIMIT 1 OFFSET 1;