设为首页 收藏本站
查看: 999|回复: 0

[经验分享] android sqlite 主键自增从1开始的问题

[复制链接]

尚未签到

发表于 2016-12-1 08:08:34 | 显示全部楼层 |阅读模式
    今天碰到了一个奇怪的问题,关于sqlite数据自增的。

我们用mysql的时候,设置主键自增,那么我们插入一条数据,主键会从1开始的,这个sqlite数据要注意了,或许,他开始的不是1,而是一个很大的数。原因待查,下面是我遇到的情况。

   网上有人说:

 


    网上查到资料说,从 SQLite 的 2.3.4 版本开始,
如果将一个表中的一个字段声明为 INTEGER PRIMARY KEY,
那么只需向该表的该字段插入一个 NULL 值,这个 NULL 值将
自动被更换为比表中该字段所有行的最大值大 1 的整数
;如果表
为空,那么将被更换为 1。
一个新的API函数 sqlite3_last_insert_rowid()返回最近的
插入操作的整形键.注意这个整型键始终比之前插入表中的最后一个
键大1。新键相对于表中的已有键来说是唯一的, 但它可能与之前
从表中删除的键值重叠。要始终得到在整个表中唯一的键,在INTEGER
PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将
总是比表中已存在的最大键大1。若可能的最大键已存在于表中,INSERT
操作将失败并返回一个SQLITE_FULL错误码.
 

   下面一句是关键句:

 


这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数
 

   我遇到的情况是:

   在android的数据库中,我有一张表A,里面有数据要复制表B中

   表A:

 


create table A (
id integer,
name text
)
 表B:(表B比表A多一个字段keyid,并且这个字段是递增的)

 


CREATE TABLE B (
keyid integer PRIMARY KEY autoincrement,
id Integer,
name text
)
 

 我将表A中的数据查询到复制到表B中去:(在操作这个步骤前表B中是有数据的)

 


首先执行的是删除表B的数据:
delete from B;
然后执行查询表A的数据插入到表B中去:
insert into B (id, name) select id,name from A ;
 
   但是奇怪的事情是:

 


表B中的keyid字段并不是从1开始的。
 

以下是分析和解决方法:

-----------------------------------------------------------

     我在将查询到A的数据插入B之前,B里面是有数据的,我首先做了删除B的数据为空。这一步是关键了,因为清空到B中的数据前,B中是有数据的,主键keyid是有值的,这个值将影响到下一次插入数据的keyid自增的数据的。具体的原因我也不知道。

 

解决方法是:

1.删除掉B

2.创建B

3.查询A插入到B

结果是B的主键是从1开始的

 


drop table B;
CREATE TABLE B (
keyid integer PRIMARY KEY autoincrement,
id Integer,
name text
)
insert into B (id, name) select id,name from A ;
 
  这样就可以让B自增从1开始了。

 

 

 

 

 

 

 

 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307868-1-1.html 上篇帖子: SQLite指南(0) 表和索引的文件存储结构 下篇帖子: Using DatabaseUtils.InsertHelper for faster insertions into SQLite database
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表