在用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设定(创建自增字段)相关推荐

  1. SQLite 数据库安装、创建、增删改查(一)

    目录 一.学习资料 二.下载软件 1.SQLite 2.SQLiteStudio 3.Navicat 15 for SQLite 4.System.Data.SQLite.dll 三.创建数据库 1. ...

  2. Series 入门(创建和增删改查)

    Series 是pandas两大数据结构中(DataFrame,Series)的一种.使用pandas 前需要将pandas 模块引入,因为Series和DataFrame用的次数非常多,所以将其引入 ...

  3. 【oracle】oracle创建表、创建索引、创建自增id

    说实话oracle实在用不习惯,虽然已经使用近两年了. 可能是习惯问题吧!毕竟mysql和mssql使用的更频繁 1.oracle创建表 创建表还是比较简单的 -- oracle 创建数据库表 CRE ...

  4. mysql 中创建自增的序列(Sequence)

    需求: 业务开发一个时间轴功能,时间轴上展示多个表的数据,时间轴滚动刷新. 问题: 获取多个表中的前几条数据比较麻烦,需要将多个表的数据拿出来排序然后limit 取数据.这样多表取数据如果数据量大很麻 ...

  5. 【Access2003】自增列的创建

    1.在数据库控制器中选择"查询"一项,选择"在设计视图中创建查询",弹出的对话框中选择"关闭",之后,在空白的灰色区域点击右键.选择SQL视 ...

  6. PostgreSQL SERIAL创建自增列

    PostgreSQL SERIAL创建自增列 本文我们介绍PostgreSQL SERIAL,并展示如何使用serial类型创建表自增列. PostgreSQL SERIAL伪类型 PostgreSQ ...

  7. python单链表操作_单链表的创建、增删改查等操作(Python实现)

    单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...

  8. 【Python数据处理篇——DataFrame数据准备】DataFrame的创建、增删改查、数据导入等

    欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. 关于DataFrame的相关知识,我还进行了汇 ...

  9. DOM操作 (创建、增、删、改、查、属性操作、事件操作)

    关于dom操作,我们主要针对于元素的操作.主要有创建.增.删.改.查.属性操作.事件操作. 1.创建 1.document.write 2.innerHTML 3.createElement 2.增加 ...

最新文章

  1. Go 学习笔记(43)— Go 标准库之 os/exec(执行外部命令、非阻塞等待、阻塞等待、命令输出)
  2. 计算机在线作业office,16春地大《计算机级等级考试Office》在线作业二.doc
  3. WinSock网络编程实用宝典(一)
  4. Java编译型语言还是解释型语言
  5. 一种支持多种流媒体协议的播放内核
  6. 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
  7. ps的魔棒工具抠图方法
  8. HZNUoj 1875 WA Jiana的游戏
  9. 新版标准日本语高级_第9课
  10. 【沉舟侧畔千帆过,病树前头万木春】---OpenFeign的各种骚操作 -VS- 既生瑜何生亮的感叹,小Ribbon怎么办?
  11. java自学练习网站推荐
  12. Hadoop与spark性能比较试验
  13. Origin——全局垂直光标
  14. 高德地图轨迹回放、点的弹跳效果、浏览器环境监测、设置地图的主题样式、GPS坐标转为高德坐标、地图加载提示、地图DOM事件、修改图层等API接口
  15. 利用计算机实现音乐节拍的实时自动跟踪,音乐节拍实时跟踪系统的研究及应用...
  16. 读书笔记 - 《天生就会跑》
  17. painter2018破解版|painter2018中文破解版下载
  18. 查找算法——俄罗斯轮盘赌算法(看谁运气不好)
  19. 千言数据集:文本相似度——数据读取部分
  20. 四个有用的vimium快捷

热门文章

  1. 华南农业大学在Annual Review of Microbiology发表三篇综述文章
  2. ggplot2笔记2:图层的使用——基础、怎样加标签、注释
  3. Error in match.names(clabs, names(xi)) : names do not match previous names
  4. pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )
  5. R语言ggplot2可视化柱状图(条形图)可视化中保留没有用到的因子水平(占位保留)
  6. R语言诊断试验数据处理与ROC分析实战案例1
  7. R语言as.numeric函数将因子变量(factor)转化为数值变量(Numeric)
  8. 直观地理解车辆的运动控制
  9. 学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!
  10. 在Linux系统下编译并执行C++程序