`
endual
  • 浏览: 3557751 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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开始了。

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android sqlite设置主键自增长的方法教程

    在本教程中,我们将探讨如何在Android的SQLite数据库中设置主键自增长的方法。 首先,我们来明确自增长主键的两个关键条件: 1. 在数据库表结构设计时,需要将主键字段声明为`INTEGER PRIMARY KEY`。这表明该字段...

    支持主键自增的数据库获取主键值.zip

    对于支持主键自增的数据库,如MySQL、SQLite、PostgreSQL等,系统会自动为每个新插入的记录生成一个唯一的主键值,无需手动设置。 在Java开发中,MyBatis作为一个轻量级的持久层框架,广泛应用于数据操作。MyBatis...

    android sqlite 使用详解.pdf

    使用`execSQL`方法执行SQL语句创建一个名为`person`的表,包含三个字段:`_id`为主键自增,`name`为字符串类型,`age`为短整型。 3. **插入数据**: - 直接使用`execSQL`方法执行SQL语句插入数据: ```java db...

    android sqlite 数据库查看器 绿色版

    5. 主键(Primary Key):用于唯一标识一行数据的列,通常设置为自增ID。 使用SQLite数据库查看器,你可以: 1. 查看所有数据库:查看设备上所有已创建的SQLite数据库文件。 2. 打开数据库:选择特定的数据库文件,...

    android sqlite

    如 INTEGER PRIMARY KEY AUTOINCREMENT 表示该字段为整数类型的主键并且是自增的。如果某个字段设置为NOT NULL,则该字段不能存储NULL值。 查询数据时,可以使用SELECT语句配合各种条件和排序方式。例如,可以使用 ...

    基于Android的SQLITE

    这里,`_id` 是一个自增的主键,`name` 存储用户姓名,`email` 存储用户邮箱,且邮箱字段必须是唯一的。 查询数据则使用`SELECT` 语句,例如获取所有用户: ```sql SELECT * FROM Users; ``` 更新数据使用`UPDATE...

    Android 下的 SQLite 操作封装

    在Android开发中,SQLite是一个轻量级的数据库系统,它被广泛用于存储应用程序的数据。`DatabaseUtil` 类是用于封装SQLite数据库操作的一个实用工具类,它简化了与数据库的交互,使得开发者能更方便地执行增删查改等...

    Android Sqlite Demo

    `_id`字段是自增主键,`name`和`email`是文本字段,`email`字段设为唯一。 3. **插入数据** 使用`SQLiteDatabase`对象的`insert()`方法来插入数据。首先,打开数据库连接,然后调用`insert()`,传入表名、空值...

    Android操作SQLite数据库项目.zip

    这里,`_id`是自增的主键,`name`、`email`和`password`是表的字段,`NOT NULL`和`UNIQUE`分别表示约束条件。 然后,我们可以使用SQLiteOpenHelper的子类实例化的SQLiteDatabase对象进行数据操作。如插入数据,使用...

    安卓Android源码——树形主键.zip

    总的来说,"安卓Android源码——树形主键.zip"可能包含了一个完整的示例,演示了如何在Android应用中使用SQLite存储树形结构数据,并在UI上展示。这涉及到数据库设计、SQLite操作、数据结构理解和自定义Adapter的...

    SQLite Database Browser 2.0

    1. 数据库设计:用户可以通过直观的界面来创建新的数据库表,定义字段类型(如整型、浮点型、文本、日期时间等),设置主键和外键约束,以及自增属性。 2. SQL查询编辑器:提供了一个内置的SQL编辑器,允许用户输入...

    SQLiteExpert3.jar

    1. 数据库创建:你可以通过这个工具创建新的SQLite数据库,定义表结构,设置字段类型、主键、外键等关系,以及自增、非空等约束。 2. 表管理:对已有的表格进行修改,添加、删除或修改字段,重命名表格,以及检查表...

    Android应用开发-SQlite数据库查询.pptx

    在Android应用开发中,SQLite数据库是一个轻量级的、嵌入式的关系型数据库,它被广泛用于存储应用内的数据。SQLite数据库提供了高效、可靠且易于使用的数据存储解决方案,尤其适合移动设备,因为它们通常资源有限。 ...

    SQLITE使用教程

    1. SQLITE 简介 SQLite 是一个开源、轻量级的嵌入式数据库系统,它不需要独立的服务器进程,而是作为应用程序的一部分运行。SQLite 支持标准的关系型数据库特性,如 SQL 语言、事务处理等,并且具有高度的可移植性,...

    SQLite 的使用

    这里,`id`是主键,`AUTOINCREMENT`表示自增。 3. 插入数据: 使用`INSERT INTO`语句将数据插入表中: ```sql INSERT INTO Students (name, age) VALUES ('张三', 20); ``` 4. 查询数据: `SELECT`语句用于...

    sql-sqlite-commands-cheat-sheet

    在当前移动应用开发中,Android平台上的本地数据存储经常使用SQLite数据库。SQLite是一种轻量级的数据库系统,它支持标准的SQL语言,通过一组简单的命令和关键字来管理数据。在这一部分中,我们将详细解析文件内容所...

    Android使用Sqlite存储数据用法示例

    这里`_id`通常作为主键,`AUTOINCREMENT`确保每次插入新行时主键自增。 3. **onUpgrade()**: 当数据库版本号增加时,此方法会被调用,用于升级旧版本的数据库到新版本。例如,添加新的表或修改现有表的结构。 `...

    AHibernate1.1

    4.实现功能:实现了主键自增和不自增控制方法的重载.默认使用主键自增, //insert(entity)方法Id会自增,相当于调用insert(entity,true); //使用insert(entity,false)这样方式可以插入有固定Id的数据 5.支持代码混淆...

    Android Studio 通过登录功能介绍SQLite数据库的使用流程

    // 这里定义了用户表user_tb,包含_id(主键自增)、userID(非空文本)、pwd(非空文本) db.execSQL("create table if not exists user_tb(_id integer primary key autoincrement, " + "userID text not null,...

Global site tag (gtag.js) - Google Analytics