2014-09-26 130 views
4

我有一種情況,我只想限制表中的50行。如果用戶在此之後插入新行,那麼應刪除第一行(首先插入),並插入新行,以便計數保持不變。 我知道我可以有一個rowid字段,在插入新記錄時,我可以檢查是否已經有50行,因此刪除最小的rowid,然後插入新的記錄。但只是想知道是否有更好的解決方案,以便我不必做3個數據庫操作(1.查詢#行,2.刪除最小值,3.插入)SQLite中限制的行數

+0

你可能會插入後考慮觸發和'ROWID <=(MAX(ROWID) - 50)刪除所有行' – ssnobody 2014-09-26 01:38:18

+0

@ssnobody這將炸燬時'rowid's是不連續的。 – 2014-09-26 08:57:15

+0

如何查詢行數或刪除一些舊行,而無需數據庫操作?根據定義,這些操作是對數據庫的操作。 – 2014-09-26 08:57:58

回答

1

我知道一種方法可行,但有點難看。它依賴於精心構建的約束和種子數據庫。爲了簡便起見,我只用五排,而不是50

create table test (
    row_num integer primary key 
    check ((round(row_num) = row_num) and (row_num between 1 and 5)), 
    other_columns char(1) not null default 'x', 
    row_timestamp timestamp 
    not null unique 
    default current_timestamp 
); 

表達round(row_num = row_num)保證你在ROW_NUM列整數。否則,SQLite會讓你在那裏插入1.54或'wibble'。

other_columns列只是您實際數據的佔位符。

insert into test (row_num, row_timestamp) values 
(1, '2015-01-01 08:00:01'), 
(2, '2015-01-01 08:00:02'), 
(3, '2015-01-01 08:00:03'), 
(4, '2015-01-01 08:00:04'), 
(5, '2015-01-01 08:00:05'); 

實際的時間戳值並不代表什麼。還沒有,無論如何。像這樣種子數據庫意味着從現在開始,您只需執行更新語句。如果表格是空的,則必須處理不同的插入和更新邏輯。例如,您必須對行進行計數才能確定是插入還是更新。

create trigger update_timestamp 
after update on test 
for each row 
begin 
    update test 
    set row_timestamp = strftime('%Y-%m-%d %H:%M:%f', 'now') 
    where row_num = OLD.row_num; 
end; 

的 「update_timestamp」 觸發使得SQLite的保持與第二(%f)級分中的時間戳。可能取決於底層操作系統是否支持小數精度。現在

create trigger no_deletes 
after delete on test 
for each row 
begin 
    -- There might be a more elegant way to prevent deletes. 
    -- This way just inserts exactly what a delete statement deletes. 
    insert into test (row_num, other_columns, row_timestamp) 
    values (OLD.row_num, OLD.other_columns, OLD.row_timestamp); 
end; 


可以更新數據。你更新自己的數據,這裏只是佔位符 other_columns,而SQLite負責處理剩下的數據。

update test 
set other_columns = 'b' 
where row_timestamp = (select min(row_timestamp) from test); 
select * from test order by row_timestamp desc; 
 
row_num  other_columns row_timestamp   
---------- ------------- ----------------------- 
1   b    2015-03-08 12:43:21.926 
5   x    2015-01-01 08:00:05  
4   x    2015-01-01 08:00:04  
3   x    2015-01-01 08:00:03  
2   x    2015-01-01 08:00:02