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设定(创建自增字段)相关推荐
- SQLite 数据库安装、创建、增删改查(一)
目录 一.学习资料 二.下载软件 1.SQLite 2.SQLiteStudio 3.Navicat 15 for SQLite 4.System.Data.SQLite.dll 三.创建数据库 1. ...
- Series 入门(创建和增删改查)
Series 是pandas两大数据结构中(DataFrame,Series)的一种.使用pandas 前需要将pandas 模块引入,因为Series和DataFrame用的次数非常多,所以将其引入 ...
- 【oracle】oracle创建表、创建索引、创建自增id
说实话oracle实在用不习惯,虽然已经使用近两年了. 可能是习惯问题吧!毕竟mysql和mssql使用的更频繁 1.oracle创建表 创建表还是比较简单的 -- oracle 创建数据库表 CRE ...
- mysql 中创建自增的序列(Sequence)
需求: 业务开发一个时间轴功能,时间轴上展示多个表的数据,时间轴滚动刷新. 问题: 获取多个表中的前几条数据比较麻烦,需要将多个表的数据拿出来排序然后limit 取数据.这样多表取数据如果数据量大很麻 ...
- 【Access2003】自增列的创建
1.在数据库控制器中选择"查询"一项,选择"在设计视图中创建查询",弹出的对话框中选择"关闭",之后,在空白的灰色区域点击右键.选择SQL视 ...
- PostgreSQL SERIAL创建自增列
PostgreSQL SERIAL创建自增列 本文我们介绍PostgreSQL SERIAL,并展示如何使用serial类型创建表自增列. PostgreSQL SERIAL伪类型 PostgreSQ ...
- python单链表操作_单链表的创建、增删改查等操作(Python实现)
单链表的创建.增删改查等操作(Python实现) # 单链表 class Node: def __init__(self, elem): self.elem = elem self.next = No ...
- 【Python数据处理篇——DataFrame数据准备】DataFrame的创建、增删改查、数据导入等
欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. 关于DataFrame的相关知识,我还进行了汇 ...
- DOM操作 (创建、增、删、改、查、属性操作、事件操作)
关于dom操作,我们主要针对于元素的操作.主要有创建.增.删.改.查.属性操作.事件操作. 1.创建 1.document.write 2.innerHTML 3.createElement 2.增加 ...
最新文章
- Go 学习笔记(43)— Go 标准库之 os/exec(执行外部命令、非阻塞等待、阻塞等待、命令输出)
- 计算机在线作业office,16春地大《计算机级等级考试Office》在线作业二.doc
- WinSock网络编程实用宝典(一)
- Java编译型语言还是解释型语言
- 一种支持多种流媒体协议的播放内核
- 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
- ps的魔棒工具抠图方法
- HZNUoj 1875 WA Jiana的游戏
- 新版标准日本语高级_第9课
- 【沉舟侧畔千帆过,病树前头万木春】---OpenFeign的各种骚操作 -VS- 既生瑜何生亮的感叹,小Ribbon怎么办?
- java自学练习网站推荐
- Hadoop与spark性能比较试验
- Origin——全局垂直光标
- 高德地图轨迹回放、点的弹跳效果、浏览器环境监测、设置地图的主题样式、GPS坐标转为高德坐标、地图加载提示、地图DOM事件、修改图层等API接口
- 利用计算机实现音乐节拍的实时自动跟踪,音乐节拍实时跟踪系统的研究及应用...
- 读书笔记 - 《天生就会跑》
- painter2018破解版|painter2018中文破解版下载
- 查找算法——俄罗斯轮盘赌算法(看谁运气不好)
- 千言数据集:文本相似度——数据读取部分
- 四个有用的vimium快捷
热门文章
- 华南农业大学在Annual Review of Microbiology发表三篇综述文章
- ggplot2笔记2:图层的使用——基础、怎样加标签、注释
- Error in match.names(clabs, names(xi)) : names do not match previous names
- pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )
- R语言ggplot2可视化柱状图(条形图)可视化中保留没有用到的因子水平(占位保留)
- R语言诊断试验数据处理与ROC分析实战案例1
- R语言as.numeric函数将因子变量(factor)转化为数值变量(Numeric)
- 直观地理解车辆的运动控制
- 学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!
- 在Linux系统下编译并执行C++程序