当前位置: 代码迷 >> SQL >> android sqlite 主键自增从1开始的有关问题
  详细解决方案

android sqlite 主键自增从1开始的有关问题

热度:84   发布时间:2016-05-05 15:22:14.0
android sqlite 主键自增从1开始的问题

? ? 今天碰到了一个奇怪的问题,关于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开始了。

?

?

?

?

?

?

?

?

?

  相关解决方案