`

sqlite 自增 table

阅读更多
在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在3.0以前rowid是32位的整数,3.0以后是 64位的整数,为什么不直接使用这个内部的rowid作为每个表的id主键呢。

相关的文档在这里:?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.html

 

用指定INTEGER PRIMARY KEY AUTOINCREMENT 和不指定自增长字段用rowid有什么区别:

使用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程。当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。

Sqlite中,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,引擎会设定为最大的rowid+1。当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。当这个rowid的值大于所能表达的最大值 9223372036854775807 (3.0及以后版本的rowid最大值)后,rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。
 第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。
 第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。
 
 比如,我们设计一个元记录表:
drop table test;
create table test (
    [tkid]            integer PRIMARY KEY autoincrement,                -- 设置主键
    [tktype]          int default 0,
    [tableid]         varchar (50),
    [createdate]      datetime default (datetime('now', 'localtime'))    -- 时间
);


 第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,并可以用使用 Update、Delete和Insert操作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid 值,但看不到。
这么看来,如果直接使用rowid来代替自增加字段,根据两者的细微的差别,需要注意是否与自己的应用冲突,如果没有冲突,那么用rowid会更快一点。

 

SQLite中创建自增字段:

简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加。

从 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错误码.

 

分享到:
评论

相关推荐

    SQLite3中自增主键相关知识总结

    在SQLite3中,自增主键是一个重要的概念,它确保了每个记录的唯一标识。本文将深入探讨SQLite3中自增主键的相关知识,包括如何清零、INTEGER PRIMARY KEY AUTOINCREMENT的特性和rowid的使用。 一、自增主键清零 在...

    SQLite Truncate Table

    在 SQLite 数据库中,虽然没有直接的 `TRUNCATE TABLE` 命令来清空一个表的所有数据,但是可以通过组合使用 `DELETE` 和 `VACUUM` 命令来达到相同的效果。这里我们将深入探讨如何在 SQLite 中实现类似 `TRUNCATE ...

    SQL 在自增列插入指定数据的操作方法

    CREATE TABLE randy_test (id INT IDENTITY ( 1 , 1 ), num INT ) 二:如果强行插入数据时: INSERT INTO randy_test VALUES (1,11) 消息 8101,级别 16,状态 1,第 1 行 仅当使用了列列表并且 IDENTITY_INSERT 为...

    Sqlite3数据库支持库

    2. SQL语句支持:SQLite3支持标准SQL语法,包括CREATE TABLE、INSERT、UPDATE、DELETE、SELECT等,以及更复杂的子查询、联接、视图和触发器。 3. ACID事务:SQLite3实现了原子性、一致性、隔离性和持久性的ACID属性...

    SQLITE使用教程

    可以使用 `SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='table_name';` 判断表是否存在。 5.2. SQLite 一条 SQL 语句插入多条记录 SQLite 不支持类似 MySQL 的批量插入语法,但可以通过拼接多...

    VB6.0 操作SQLite 数据库的完整示例代码

    conn.Execute "CREATE TABLE Users (ID INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)" ``` 3. 插入数据:使用SQL的INSERT INTO语句将数据添加到表中。 ```vb conn.Execute "INSERT INTO Users (ID, Name, Age...

    sqlite 支持的 sql 语法详解

    2. 不支持自增列(AUTO_INCREMENT)的声明,但可以使用 INTEGER PRIMARY KEY 代替。 3. 不支持 CHECK 约束。 4. 不支持某些特定的聚合函数,如 GROUP_CONCAT 在 MySQL 中常见,但在 SQLite 中没有。 5. 不支持窗口...

    sql-sqlite-commands-cheat-sheet

    `AUTOINCREMENT`关键字可以用于自增字段,确保每个值都是唯一的。 通过以上内容,我们可以了解到SQLite的一些基础命令和关键字,这对于学习Android开发是很有帮助的。实际上,在Android开发中,通常我们会使用...

    SQLite-Expert-Personal使用教程.docx

    对于那些需要自增ID字段的场景,SQLite-Expert-Personal提供了简便的解决方案: 1. **添加自增字段**: - 在已经创建好的表上,通过“Design”下的“Fields”页面添加一个新字段。 - 将此字段的类型设置为...

    SQLiteStudio.rar

    支持SELECT、INSERT、UPDATE、DELETE以及ALTER TABLE等命令。 5. **视图创建**:你可以创建视图,将多个表的查询结果组合成一个新的逻辑表,这对于数据分析和简化复杂查询非常有用。 6. **索引管理**:添加、删除...

    SQLite之Autoincrement关键字(自动递增)

    SQLite中的`AUTOINCREMENT`关键字是用于创建具有自动递增特性的整型字段的关键字,它主要用在定义表格结构时,确保某列的值在每次插入新记录时都会自动增加。这一特性通常应用于主键列,以确保每条记录都有唯一的...

    SQLite 的使用

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

    android sqlite 使用详解.pdf

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

    android sqlite

    当需要更新表结构时,SQLite提供了ALTER TABLE语句来更改表结构。例如,可以用来重命名表或添加新的字段。如果需要删除表,可以使用DROP TABLE语句。另外,数据库操作的MVC模式在Android中也是常见的实践,其中Model...

    SQLite总结

    - 示例:创建一个名为`mytable`的表,其中包含一个自增的主键`_id`,一个文本类型的列`title`,以及一个浮点数类型的列`value`。 ```java db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY ...

    Android 下的 SQLite 操作封装

    它定义了一个包含三个字段的表,即自增的主键 `_id`,非空的姓名字段 `name` 和非空的年级字段 `grade`。 3. **成员变量**: - `mCtx`: 上下文对象,用于初始化数据库辅助类 `DatabaseHelper`。 - `mDbHelper`: `...

    基于Android的SQLITE

    在Android的SQLite数据库中,表的创建通常通过SQL的`CREATE TABLE` 语句完成。例如,创建一个包含用户信息的"Users"表,可能的SQL语句如下: ```sql CREATE TABLE Users ( _id INTEGER PRIMARY KEY AUTOINCREMENT,...

    android sqlite 数据库查看器 绿色版

    2. 表格(Table):存储数据的结构,由列(Column)和行(Row)组成。 3. 列(Column):定义表格中数据的属性,每个列都有一个唯一的名称和数据类型。 4. 行(Row):表格中的数据记录,每行都有一组值,对应每一列...

Global site tag (gtag.js) - Google Analytics