Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn SQL:Xóa tất cả các bản ghi khỏi bảng ngoại trừ N mới nhất?

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 cần thiết. Nếu không có nó, chúng tôi sẽ gặp phải hai lỗi:

  1. 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.
  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhanh nhất để nhập tệp CSV lớn vào MySql bằng MySql CLI

  2. Lỗi MySQL # 1071 - Khóa được chỉ định quá dài; độ dài khóa tối đa là 767 byte

  3. Cách sao chép bảng trong MySQL

  4. Cơ sở dữ liệu mặc định của MySQL

  5. Lỗi MySQL 2006:Máy chủ mysql đã biến mất