`
473687880
  • 浏览: 535863 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

在用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_key

    通过调用 sqlite3_key() 或 sqlite3_rekey() 函数,可以在创建或打开数据库时设定密钥,从而对数据进行保护。这些函数接受一个加密算法和密钥作为参数,确保只有知道正确密钥的程序才能访问数据库。 在使用 ...

    Sqlite3重编译版本,支持Sqlite3_key和Sqlite3_rekey方法.rar

    这个压缩包文件提供了一个特别的SQLite3版本,它经过了重编译,增加了对`Sqlite3_key`和`Sqlite3_rekey`方法的支持。这两个方法是关于数据库加密的关键功能,对于那些需要增强数据安全性的应用来说尤为重要。 `...

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

    本文将深入探讨SQLite3中自增主键的相关知识,包括如何清零、INTEGER PRIMARY KEY AUTOINCREMENT的特性和rowid的使用。 一、自增主键清零 在其他数据库系统中,如MySQL或PostgreSQL,可以使用TRUNCATE TABLE命令...

    SQLite3 支持sqlite3-key() sqlite3-rekey()

    免费版sqlite不带加解密功能,这个wssqlite实现了加解密数据库的功能,网上好多都是不能编译成功的,所以作者编译后,可以直接使用该资源,包含(sqlite3.h,sqlite3.lib,sqlite2.dll,sqlite3userauth.h)

    Sqlite Expert license key

    1. **数据库设计**:SQLite Expert允许用户通过拖放方式创建和编辑表格,设置字段类型、约束(主键、唯一、外键等)、默认值和自增属性。此外,还可以创建和管理索引,优化查询性能。 2. **SQL编辑与调试**:内置的...

    可加密的Sqlite3.dll和Sqlite3.lib

    `Sqlite3_key`用于设置数据库的初始加密密钥,而`Sqlite3_rekey`则允许在数据库已创建后更改加密密钥,这在需要增强数据安全性或更新安全策略时非常有用。 在使用这些加密功能时,开发者需要注意以下几点: 1. 加密...

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

    SQL Server 中数据表往往会设置自增列,常见的比如说 首列的ID列。 往数据表插入新数据的时候,自增列是跳过的,无需插入即会按照设置的自增规则进行列增长。那么,如果我们想往自增列插入我们指定的数据时该怎么做...

    sqlite3 源文件工程,生成可支持sqlite3-key() sqlite3-rekey()

    免费版sqlite不带加解密功能,这个wssqlite实现了加解密数据库的功能,网上好多都是不能编译成功的,所以作者拱建了一个VS2008+SQLITE3源码平台,可供开发者修改参数后生成SQLITE3.lib SQL3LITE3.DLL

    SQLite Expert Professional 通用key

    这个通用key适用于版本3.x到5.x,意味着用户可以在多个版本的SQLite Expert Professional中使用同一个激活码,无需因软件升级而重新购买。 SQLite是一个开源的关系型数据库系统,广泛应用于嵌入式设备、移动应用...

    Sqlite3数据库支持库

    SQLite3数据库支持库是实现与SQLite3交互的关键组件,它包含了用于创建、操作和查询SQLite3数据库的所有函数和结构。以下是一些关键知识点: 1. 数据库文件格式:SQLite3将数据库存储在一个单一的文件中,这使得...

    用python sqlite3给已经有的表增加字段

    用python sqlite3给已经有的表增加字段。sql语句的写法,表名用自己的,其他的请严格区分大小写,要不然不会成功。

    sqlite3加密版本数据库

    基于sqlite3的加密版本的数据库动态链接库,附lib和.h头文件,新测试可用。可设置密码和修改密码,加密后的数据库文件是无法被打开的。官方提供的免费版本sqlite3都是没有加密的,官方收费的很贵哦,有需要的朋友...

    sqlite3文件(sqlite3.dll,sqlite3.h,sqlite3.lib)

    它包含了SQLite3的全部功能实现,当你的应用程序运行时,会依赖这个库来执行与SQLite3相关的操作,如创建数据库、执行SQL语句、读取数据等。如果你的应用程序是基于C或C++编写并链接到`sqlite3.dll`,那么在目标机器...

    delphi使用unidac连接sqlite实现增删改的例子

    然后,配置连接字符串(ConnectionString),通常包括数据库文件路径,例如:“DriverID=SQLite3;Database=C:\mydb.sqlite”。 2. **创建TUniQuery组件** TUniQuery是执行SQL查询的主要组件。添加TUniQuery到表单...

    Linux-sqlite3

    **Linux SQLite3** ...5. `sqlite3_key` 和 `sqlite3_rekey`:对数据库进行加密和重新加密。 这些工具对于数据库的日常管理和维护非常有用,特别是对于开发者来说,可以方便地进行数据操作和性能分析。

    SQlite3库及头文件分享

    文件列表:1)sqlite3.h;2)sqlite3.lib;3)sqlite3.dll; 学习VS2010/MFC下数据库编程已经有一段时间了,大多是在网站上浏览一些资源,这些资源大多以VC6.0位开发环境,而在VS2010下往往出现问题,所幸看到了...

    Sqlite3时间存储格式问题?

    SQLite3 是一个轻量级的关系型数据库管理系统,它在处理日期和时间数据时与其他数据库系统有所不同。SQLite3 不提供特定的日期和时间数据类型,而是允许用户以 TEXT、REAL 或 INTEGER 的形式存储日期和时间值。这种...

    Delphi使用ASqlite3 连接SQLite上例子

    2. **配置连接**:在TASqlite3Connection的`Params`集合中,可以设置连接参数,如`Key`为'SQLite3LibPath',`Value`为SQLite动态链接库的路径,确保Delphi能找到正确的SQLite3库。 3. **建立数据表**:放置TASqlite...

    delphi+sqlite3带加密Demo

    1、获取sqlite3.dll,去网上下载wxsqlite3的最新版本代码,解压后其中有一个sqlite3目录,其中有编译好的版本,lib目录下的是原版本,secure目录下有aes128和aes256两个带加密的版本,直接拿其中任一个sqlite3.dll...

Global site tag (gtag.js) - Google Analytics