2009-12-29 31 views
10

Tôi muốn tạo một bảng SQL không có nhiều hơn n hàng dữ liệu. Khi một hàng mới được chèn vào, tôi muốn xóa hàng cũ nhất để tạo không gian cho hàng mới.Các hàng lăn trong bảng SQL

Có cách xử lý điển hình trong SQLite không?

Quản lý nó với một số mã bên ngoài (bên thứ ba)?

Trả lời

11

Mở rộng trên Alex' answer, và giả sử bạn có một incrementing, không lặp lại cột nối tiếp trên bàn t tên serial mà có thể được sử dụng để xác định tuổi tương đối của hàng:

CREATE TRIGGER ten_rows_only AFTER INSERT ON t 
    BEGIN 
    DELETE FROM t WHERE serial <= (SELECT serial FROM t ORDER BY serial DESC LIMIT 10, 1); 
    END; 

này sẽ làm gì khi bạn có ít hơn mười hàng, và sẽ DELETE nối tiếp thấp nhất khi một INSERT sẽ đẩy bạn đến mười một hàng.

CẬP NHẬT

Dưới đây là một trường hợp hơi phức tạp hơn, nơi bảng hồ sơ của bạn "tuổi" của hàng trong một cột mà có thể chứa bản sao, ví dụ như một cột theo dõi thời gian chèn TIMESTAMP.

sqlite> .schema t 
CREATE TABLE t (id VARCHAR(1) NOT NULL PRIMARY KEY, ts TIMESTAMP NOT NULL); 
CREATE TRIGGER ten_rows_only AFTER INSERT ON t 
    BEGIN 
    DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY ts DESC LIMIT 10, -1); 
    END; 

Ở đây chúng ta đưa cho các cấp mà chúng ta không thể sử dụng id để xác định tuổi tương đối, vì vậy chúng tôi xóa tất cả mọi thứ sau 10 hàng đầu tiên đặt hàng bởi dấu thời gian. (SQLite áp đặt một thứ tự tùy ý trên các hàng chia sẻ cùng một ts).

+0

sẽ không này luôn xóa hàng đầu tiên? – aronchick

+0

@aronchick, no - truy vấn con vô hướng sẽ đánh giá NULL nếu không có bản ghi ở vị trí thứ 11 (SAU CH our của chúng tôi có thể là hàng thứ 11), và do đó mệnh đề 'WHERE' sau đó trở thành' WHERE serial <= NULL', mà sẽ không phù hợp với bất cứ điều gì. – pilcrow

+0

Điều gì sẽ xảy ra nếu _id được tăng tự động. Không thể mã này được thực hiện bằng _id thay vì TIMESTAMP hoặc nối tiếp? Đặc biệt khi dấu thời gian không phải lúc nào cũng là một phần của lược đồ bảng ... –

0

Điều này sẽ giống như cách bạn thực hiện. Điều này giả định rằng my_id_column là tự động tăng và là cột thứ tự cho bảng.

-- handle rolls forward 
-- deletes the oldest row 
create trigger rollfwd after insert on my_table when (select count() from my_table) > max_table_size 
    begin 
    delete from my_table where my_id_column = (select min(my_id_column) from my_table); 
    end; 

-- handle rolls back 
-- inserts an empty row at the position before oldest entry 
-- assumes all columns option or defaulted 
create trigger rollbk after delete on my_table when (select count() from my_table) < max_table_size 
    begin 
    insert into my_table (my_id_column) values ((select min(my_id_column) from my_table) - 1); 
    end; 
Các vấn đề liên quan