sqlite3自增key设定(建立自增字段)

在用sqlite设计表时,每一个表都有一个本身的整形id值做为主键,其实能够不指定这么一个id值,sqlite内部原本就会为每一个表加上一个 rowid,这个rowid能够当成一个隐含的字段使用,可是由sqlite引擎来维护的,在3.0之前rowid是32位的整数,3.0之后是 64位的整数,为何不直接使用这个内部的rowid做为每一个表的id主键呢。 html

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

 

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

使用自增加字段为主键有很多问题,好比维护或是在大型分布应用中主键冲突的解决等。在一些大型分布应用中主键通常选用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'))    -- 时间
); ui


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

 

SQLite中建立自增字段: sqlite

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

从 SQLite 的 2.3.4 版本开始,若是你将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么不管你什么时候向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段全部行的最大值大 1 的整数;若是表为空,那么将被更换为 1。 rem

一个新的API函数 sqlite3_last_insert_rowid() 返回最近的插入操做的整形键. 文档

注意这个整型键始终比以前插入表中的最后一个键大1。新键相对于表中的已有键来讲是惟一的,但它可能与以前从表中删除的键值重叠。要始终获得在整个表中惟一的键,在INTEGER PRIMARY KEY的声明以前加关键词AUTOINCREMENT.这样被选的键将老是比表中已存在的最大键大1。若可能的最大键已存在于表中,INSERT操做将失败并返回一个SQLITE_FULL错误码.

相关文章
相关标签/搜索