我有一種情況,我只想限制表中的50行。如果用戶在此之後插入新行,那麼應刪除第一行(首先插入),並插入新行,以便計數保持不變。 我知道我可以有一個rowid字段,在插入新記錄時,我可以檢查是否已經有50行,因此刪除最小的rowid,然後插入新的記錄。但只是想知道是否有更好的解決方案,以便我不必做3個數據庫操作(1.查詢#行,2.刪除最小值,3.插入)SQLite中限制的行數
4
A
回答
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
相關問題
- 1. 限制SQLite數據庫中的行數
- 2. 限制sqlite表的最大行數
- 3. 限制和SQLite中
- 4. SQLite交易次數限制?
- 5. Android - SQLite的限制
- 6. Sqlite:觸發器來限制行中的數量值
- 7. 在sqlite中限制記錄
- 8. 限制Datalist中的行數
- 9. textarea中的行數限制
- 10. 如何選擇具有條件的行數限制的Sqlite表中的行?
- 11. 限制Textarea中的行數(或行數)
- 12. 根據列的值限制表可以包含的行數 - SQLite
- 13. 限制行數
- 14. 如何限制SQLite/MySQL中的列值
- 15. 限制每頁行中的行數
- 16. SQLite列限制:只有整數
- 17. Android Sqlite刪除限制
- 18. Sqlite字段大小限制
- 19. 限制NSAttributedString行數
- 20. SQLite的複製行
- 21. 在Android中獲取的限制記錄(Sqlite數據庫)
- 22. Android中的光標大小限制SQLite數據庫
- 23. 對MySQL中行數的限制
- 24. 限制rails_admin中表的行數
- 25. 限制OleDbDataAdapter查詢中的行數
- 26. Javascript中的行數是否有限制?
- 27. 限制SQL表中的行數
- 28. SQL Server表中的行數限制
- 29. 如何限制Textarea(Redactor)中的行數?
- 30. 限制html中的行數JLabel
你可能會插入後考慮觸發和'ROWID <=(MAX(ROWID) - 50)刪除所有行' – ssnobody 2014-09-26 01:38:18
@ssnobody這將炸燬時'rowid's是不連續的。 – 2014-09-26 08:57:15
如何查詢行數或刪除一些舊行,而無需數據庫操作?根據定義,這些操作是對數據庫的操作。 – 2014-09-26 08:57:58