在用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错误码.
问系统表:sqlite_master啊。呵呵!
例如:self.cur.execute("SELECT COUNT(*) FROM sqlite_master where type='table' and name='%s'" % tname)
分享到:
相关推荐
SQLITE3使用总结,SQLITE操作入门
【SQLite3 使用总结】 SQLite3 是一款轻量级的关系型数据库管理系统,因其开源、小巧、高效的特点而广受欢迎。董淳光的这篇文章主要涵盖了SQLite3的几个关键方面,包括版本信息、基本编译方法以及如何使用SQLite3...
在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,适用于移动设备。...通过阅读"android SQLite总结.pdf"和参考文件"njupt.zhb.SQLite1",你可以进一步加深对这些概念的理解和实践。
SQLite SQL 语句使用总结 SQLite 是一个软件库,用于实现自包含、非服务式、零配置、事务化的 SQL 数据库引擎。SQLite 直接读写原始的磁盘文件,一个拥有多个表、索引、触发器和视图的完整 SQL 数据库就包含在一个...
### SQLITE3 使用总结 #### 一、SQLite3简介与特性 SQLite是一款轻量级的数据库管理系统,它以源代码的形式发布,并且具有跨平台性,支持Windows、Linux、Mac OS等操作系统。SQLite的一个显著特点就是它不需要单独...
- 查询数据:使用`sqlite3_prepare_v2()`准备SQL语句,然后通过`sqlite3_step()`遍历查询结果。 3. **SQLite3 C/C++ 开发接口** - `sqlite3`库:这是SQLite的C/C++ API,提供了丰富的函数供开发者调用。 - `...
SQLite3是一款轻量级的、开源的、...总结,SQLite3是一个功能强大且易于使用的数据库系统,它的灵活性和便携性使其成为许多开发者的首选。通过掌握以上基本操作和SQL语法,你将能够有效地管理和操作SQLite3数据库。
### SQLITE3 加密总结 #### 一、序言 随着信息安全的重要性日益提升,数据库加密成为保护数据安全的重要手段之一。SQLite作为一个轻量级且高效的关系型数据库系统,因其跨平台特性及无需服务器进程的优点,在移动...
总结,这个“uniAPP使用sqlite数据库demo”项目是学习和实践如何在uniAPP中利用SQLite存储和管理本地数据的宝贵资源。通过深入理解上述知识点,开发者能够有效地在uniAPP应用中构建自己的数据库管理系统,满足各种...
在本文中,我们将深入探讨SQLite数据库的相关知识点,包括其原理、特性、API使用、数据类型、SQL语法以及常见操作。 1. SQLite原理与特性: - **轻量级**: SQLite不需要独立的服务器进程,它作为一个库直接嵌入到...
SQLite是一款轻量级的、开源的关系型数据库管理系统,它无需...总结,SQLite在VC环境下使用主要涉及库的配置、API的调用以及错误和事务处理。理解并熟练运用这些知识点,可以轻松地在VC项目中实现数据存储和查询功能。