2010-09-08 28 views
17

Tôi có một cơ sở dữ liệu với 1000 bản ghi. Tôi đang cố gắng tạo một câu lệnh SQL vì vậy nếu số lượng bản ghi tăng lên trên 1000, thì các bản ghi cũ nhất sẽ bị xóa (tức là các bản ghi mới trên 1000 'thay thế' các bản ghi cũ nhất). Tôi đang sử dụng SQLite, nhưng tôi cho rằng cú pháp SQL thông thường sẽ khớp ở đây.Xóa các bản ghi cũ nhất khỏi cơ sở dữ liệu

+0

Bạn có thể nhận được nhiều câu trả lời hơn nếu bạn bao gồm một số chi tiết lược đồ bảng. – serg10

+0

Bạn có thể muốn cung cấp thêm thông tin. Giống như bạn có một dấu thời gian trên các cột? Id là GUID hay tăng tự động? mục tiêu của bạn là gì để loại bỏ tất cả cũ hơn X ngày hoặc là có một giới hạn của 1000 hồ sơ? hoặc lý do xóa các hồ sơ này là gì? Chúng tôi có thể trả lời tốt hơn câu hỏi của bạn sau đó. –

+0

Ồ và trường khóa chính của bạn là gì? hoặc thậm chí bạn có một? –

Trả lời

35

Nếu bạn sử dụng một lĩnh vực tự động tăng, bạn có thể dễ dàng viết này để xóa lâu đời nhất 100 hồ sơ:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable ORDER BY id ASC LIMIT 100) 

Hoặc, nếu không có trường như vậy là hiện nay, sử dụng ROWID:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID ASC LIMIT 100) 

Hoặc chỉ để lại 1000 bản ghi mới nhất:

DELETE FROM mytable WHERE ROWID IN (SELECT ROWID FROM mytable ORDER BY ROWID DESC LIMIT -1 OFFSET 1000) 
+1

Cảm ơn, nhưng tôi cần một ... giới hạn -1 bù đắp 1000 – Seven

+0

Tôi đã suy nghĩ về việc sử dụng này cũng có, nhưng sẽ không MySQL sử dụng các ID đã xóa trước đó vì vậy điều này sẽ không làm việc nữa? Vì ID = 1 sẽ có sẵn, một hàng mới hơn sẽ được tạo với ID = 1 sau đó sẽ bị xóa đầu tiên ..? – NaturalBornCamper

1

Giả sử rằng bảng của bạn có Key và một cột với timestamp chỉ khi bản ghi được chèn), bạn có thể sử dụng một truy vấn dọc theo dòng của

delete from tableToDeleteFrom 
where tablePK in 
(select tablePK 
from tableToDeleteFrom 
where someThresholdDate <= @someThresholdDate) 
-3

Đối xóa tất cả hồ sơ, ngoại trừ bản ghi đầu tiên (min/max id), bạn có thể sử dụng:

SET @ls AS INT 

SELECT @ls = MIN(id) FROM DATA 

DELETE FROM DATA WHERE id <> @ls 
+0

Có thực sự trả lời câu hỏi không? – voromax

Các vấn đề liên quan