Sqlite之删除超过50条的数据
2013-11-14 18:06
996 查看
在应用中,总要对用户的一些操作进行记录,比如播放历史记录,搜索历史记录等,方便用户再次使用。但是这些记录又不能无限的存储,只需要记录最新的50条或者100条就可以了,所以要求应用每插入一条新数据之后,对超过50条的数据进行清理。
本文以搜索历史记录为例,主要介绍sqlite中limit ,offset关键字的使用,最后给出此复合语句的写法。
搜索历史记录只需要记录搜索关键词和搜索时间即可。所以我们需要这样的一张表:
表中只有两个字段(keyword , time):其中keyword是唯一的,不允许重复;时间默认为写入数据库的默认时间,我们可是使用sqlite数据的datetime(‘now’)函数
好了,给出搜索历史记录(search_history)建表语句:
[sql]
view plaincopy
CREATE TABLE [search_history] ([keyword] CHAR UNIQUE,[time] TIMESTAMP NOT NULL ON CONFLICT REPLACE DEFAULT (datetime(‘now’)))
limit 语法有两种写法s
1. 一个参数 : limit x
其中x是一个整数,表示返回x条目记录。
2.两个参数: limit x , y
其中x , y 都是整数,表示跳过x 条记录,返回 y 条记录,即 LIMIT <skip>, <count>
此外limit 还与offset关键词结合,语法是: limit x offset y
表示跳过 y 条记录,返回 x 条记录 ,即 LIMIT <count> OFFSET <skip>
乍一看 limit x , y 和limit x offset y 的语义很接近,千万不要搞混了。
由于我们的表中只有上图所示4条数据,为了演示方便,我们将最大数量定位2,超过2条以上的数据将被删除。
在这里我们选用offset关键词,一步步获得超过2以后的记录。
1:首先计算keyword的数量,确保数据库中的条目大于最大值2 ,这是重要的条件之一。条件不成立,不进行删除操作。
[sql]
view plaincopy
select * from search_history where (select count(keyword) from search_history) >2
因为4>2 ,所以返回全部数据结果:
2:接下来,我们将按照时间(time字段)降序排列数据,筛选所有的关键词
[sql]
view plaincopy
select keyword from search_history order by time desc
返回结果:
3. 扩展第2步 , 在按照时间(time字段)降序,获得超过最大值2以上的所有关键词。也就是在第2步的基础,加入limit关键词
[sql]
view plaincopy
select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 2
返回结果:
现在我们已经将超过最大值2以上的时间较早的搜索关键词查询出来了,大功即将搞成。接下下将这些数据删除即可,当然不要忘了加入我们第1步的条件。
4. 结合第一步的条件,最终复合sql语句就是:
[sql]
view plaincopy
delete from search_history where (select count(keyword) from search_history
)> 2 and keyword in (select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 2 )
执行之后,可以看到超过最大值2的数据,也就是第3步中的数据都被删除了。重新查询之后的结果如下:
说明执行结果是正确的。
最后将最大值2改为50就可以了:
最终语句如下:
[sql]
view plaincopy
delete from search_history where (select count(keyword) from search_history
)> 50 and keyword in (select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 50 )
原文链接:http://www.67tgb.com/?p=530
转载请注明出处:望月听涛
本文以搜索历史记录为例,主要介绍sqlite中limit ,offset关键字的使用,最后给出此复合语句的写法。
建表
搜索历史记录只需要记录搜索关键词和搜索时间即可。所以我们需要这样的一张表:表中只有两个字段(keyword , time):其中keyword是唯一的,不允许重复;时间默认为写入数据库的默认时间,我们可是使用sqlite数据的datetime(‘now’)函数
好了,给出搜索历史记录(search_history)建表语句:
[sql]
view plaincopy
CREATE TABLE [search_history] ([keyword] CHAR UNIQUE,[time] TIMESTAMP NOT NULL ON CONFLICT REPLACE DEFAULT (datetime(‘now’)))
Sqlite之limit ,offset关键词
limit 语法有两种写法s1. 一个参数 : limit x
其中x是一个整数,表示返回x条目记录。
2.两个参数: limit x , y
其中x , y 都是整数,表示跳过x 条记录,返回 y 条记录,即 LIMIT <skip>, <count>
此外limit 还与offset关键词结合,语法是: limit x offset y
表示跳过 y 条记录,返回 x 条记录 ,即 LIMIT <count> OFFSET <skip>
乍一看 limit x , y 和limit x offset y 的语义很接近,千万不要搞混了。
复合SQL语句演练:
由于我们的表中只有上图所示4条数据,为了演示方便,我们将最大数量定位2,超过2条以上的数据将被删除。在这里我们选用offset关键词,一步步获得超过2以后的记录。
1:首先计算keyword的数量,确保数据库中的条目大于最大值2 ,这是重要的条件之一。条件不成立,不进行删除操作。
[sql]
view plaincopy
select * from search_history where (select count(keyword) from search_history) >2
因为4>2 ,所以返回全部数据结果:
2:接下来,我们将按照时间(time字段)降序排列数据,筛选所有的关键词
[sql]
view plaincopy
select keyword from search_history order by time desc
返回结果:
3. 扩展第2步 , 在按照时间(time字段)降序,获得超过最大值2以上的所有关键词。也就是在第2步的基础,加入limit关键词
[sql]
view plaincopy
select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 2
返回结果:
现在我们已经将超过最大值2以上的时间较早的搜索关键词查询出来了,大功即将搞成。接下下将这些数据删除即可,当然不要忘了加入我们第1步的条件。
4. 结合第一步的条件,最终复合sql语句就是:
[sql]
view plaincopy
delete from search_history where (select count(keyword) from search_history
)> 2 and keyword in (select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 2 )
执行之后,可以看到超过最大值2的数据,也就是第3步中的数据都被删除了。重新查询之后的结果如下:
说明执行结果是正确的。
最后将最大值2改为50就可以了:
最终语句如下:
[sql]
view plaincopy
delete from search_history where (select count(keyword) from search_history
)> 50 and keyword in (select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 50 )
原文链接:http://www.67tgb.com/?p=530
转载请注明出处:望月听涛
相关文章推荐
- Android Sqlite之删除超过50条的数据
- Sqlite之删除超过50条的数据
- 数据库之删除超过50条的数据
- Android sqlite数据删除解决自增id问题
- FireDAC 下的 Sqlite [5] - 数据的插入、更新、删除
- 解决sqlite删除数据后,文件大小不变问题
- Android之sqlite常见用法以及取最新多少条数据(包括删除和不删除之外的数据)
- remedy定期删除超过一定时间的流转垃圾数据
- 按照用户ID进行分组,保留用户的最新的1000条数据,超过1000条的都进行删除
- 解决sqlite删除数据后,文件大小不变问题
- sqlite删除数据时主键不能更新
- Sqlite插入、修改、删除表里面的数据
- C#中如何解决sqlite数据表/记录删除后数据库内存不变的问题
- 解决sqlite删除数据后,文件大小不变问题(VACUUM)
- android 数据库 SQLiteOpenHelper和ContentProvider学习笔记---添加修改删除数据之联系人(二)
- SQLite Expert 删除表数据并重置自动增长列
- android: SQLite删除数据
- SQLite 实现删除表中前一天的数据
- sqlite数据类型、关键词及创建、修改、删除数据表
- Android开发—数据库应用—访问数据表(SQLite OpenHelper) —删除数据