数据库之删除超过50条的数据


转自:http://blog.csdn.net/wangyuetingtao/article/details/8446474

在应用中,总要对用户的一些操作进行记录,比如播放历史记录,搜索历史记录等,方便用户再次使用。但是这些记录又不能无限的存储,只需要记录最新的50条或者100条就可以了,所以要求应用每插入一条新数据之后,对超过50条的数据进行清理。

   本文以搜索历史记录为例,主要介绍sqlite中limit,offset关键字的使用,最后给出此复合语句的写法。

建表

   搜索历史记录只需要记录搜索关键词和搜索时间即可。所以我们需要这样的一张表:

   表中只有两个字段(keyword ,time):其中keyword是唯一的,不允许重复;时间默认为写入数据库的默认时间,我们可是使用sqlite数据的datetime(‘now’)函数

   好了,给出搜索历史记录(search_history)建表语句:

 

[sql]  viewplain copy
  1. CREATE TABLE [search_history] ([keyword] CHAR UNIQUE,[timeTIMESTAMP NOT NULL ON CONFLICT REPLACE DEFAULT (datetime(‘now’)))  


 

Sqlite之limit,offset关键词

 limit 语法有两种写法s

  1.一个参数 : limit x

    其中x是一个整数,表示返回x条目记录。 

 2.两个参数: limit x , y  

    其中x , y 都是整数,表示跳过x 条记录,返回 y 条记录,即 LIMIT,

   此外limit 还与offset关键词结合,语法是: limit x offsety 

   表示跳过 y 条记录,返回 x 条记录 ,即 LIMITOFFSET

   乍一看 limit x , y 和limit x offset y 的语义很接近,千万不要搞混了。

复合SQL语句演练

   由于我们的表中只有上图所示4条数据,为了演示方便,我们将最大数量定位2,超过2条以上的数据将被删除。

   在这里我们选用offset关键词,一步步获得超过2以后的记录。

   1:首先计算keyword的数量,确保数据库中的条目大于最大值2,这是重要的条件之一。条件不成立,不进行删除操作。

[sql]  viewplain copy
  1. select from search_history where (select count(keyword) from search_history) >2  


 

   因为4>2 ,所以返回全部数据结果:

 2:接下来,我们将按照时间(time字段)降序排列数据,筛选所有的关键词

 

[sql]  viewplain copy
  1. select keyword from search_history order by time desc  

 


    返回结果:

   3.  扩展第2步 ,在按照时间(time字段)降序,获得超过最大值2以上的所有关键词。也就是在第2步的基础,加入limit关键词

 

[sql]  viewplain copy
  1. select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset  


 

 

   返回结果:

  现在我们已经将超过最大值2以上的时间较早的搜索关键词查询出来了,大功即将搞成。接下下将这些数据删除即可,当然不要忘了加入我们第1步的条件。

   4. 结合第一步的条件,最终复合sql语句就是:

  

[sql]  viewplain copy
  1. 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的数据,也就是第3步中的数据都被删除了。重新查询之后的结果如下:

 说明执行结果是正确的。

 最后将最大值2改为50就可以了:

 最终语句如下:

  

[sql]  viewplain copy
  1. delete from search_history where (select count(keyword) from search_history   
  2. )> 50 and keyword in (select keyword from search_history order by time desc limit (select count(keyword) from search_history) offset 50 
  3. sqlite trigger 语法
  4. syntax diagram create-trigger-stmt



    // 保留最新的30条 -- 防止无限填充
    NSString *deletesql = @"delete from DetailHistory where (select count(rowid) from DetailHistory)> 30 and rowid in (select rowid from DetailHistory order by rowid desc limit (select count(rowid) from DetailHistory) offset 30)";





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值