SQLite3中自增主键相关知识总结
一、SQLite清空表并将自增列归零
SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。
但SQLite不支持这个语句。在SQLite中直接使用 DELETE FROM TableName 就可以了。
对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。
SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:
通常在清空表的时候,还需要把自增列归零。在SQLite中定义自增列的方法如下:
复制代码 代码如下:
CREATE TABLE TableName ( id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer );
当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。
这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。
如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
复制代码 代码如下:
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';
也可以直接把该记录删掉:
复制代码 代码如下:
DELETE FROM sqlite_sequence WHERE name='TableName';
要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了:
复制代码 代码如下:
DELETE FROM sqlite_sequence;
二、Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
在用sqlite设计表时,突然想到一个问题,就是我设计的表中,每个表都有一个自己的整形id值作为主键,
其实可以不指定这么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,
为什么不直接使用这个内部的rowid作为每个表的id主键呢。
使用自增长字段为主键有不少问题,比如维护或是在大型分布应用中主键冲突的解决等。
在一些大型分布应用中主键一般选用guid,这可以有效的避免主键冲突,减少对主键维护的工程。
当然,对于中小型的应用,自增长字段的好处更多一些,简单、快速。
Sqlite中,一个自增长字段定义为 INTEGER PRIMARY KEY AUTOINCREMENT
那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值,
引擎会设定为最大的rowid+1 当然,也可以设置为非NULL的数字来自己指定这个值,但这样就必须自己小心,不要引起冲突。
rowid的新值会这个最大数之前随机找一个没被使用了的值。所以在rowid达到最大值前,rowid的值是严格单调增加的。
INTEGER PRIMARY KEY AUTOINCREMENT 自增长字段的算法与rowid稍微有些不同。
第一,在达到最大值后,rowid会找已被删除的字段对应的rowid作为新值,而自增长字段则会丢出一个SQLITE_FULL的错误。
第二,自增长字段在增加新值时,是找一个从没被使用过的rowid作为新值,而rowid则是找最大已存在的rowid+1。
这里对应用的影响会比较大,尤其是一些对id值有依赖的元记录,只适合使用自增长字段而不能用rowid。
比如,我们设计一个元记录表:
复制代码 代码如下:
Create table meta_struct(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, type Integer);
然后,定义一个一级表,来描述其它表的结构:
复制代码 代码如下:
Create table meta_table(tableid INTEGER, table_field integer)
最后,我们的应用可以根据这个一级表来产生实际使用的二级表。
这样为保证兼容性meta_struct中的id必须是唯一的,如果有字段被删除,也不能重复使用这个字段的id值,不然,在数据库合并时,
一级表和二级表就会混乱。所以meta_struct表中的主键只能使用自增长字段,而不能用rowid。
第三,使用自增长字段,引擎会自动产生一个sqlite_sequence表,用于记录每个表的自增长字段的已使用的最大值,用户可以看到,
并可以用使用Update、Delete和Insert操作,但不建议这么使用,这会让引擎混乱。如果使用rowid,也会有这么一个内部表,用户可以维护rowid值,但看不到。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/sqlite/8705.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Androidsqlite增删改查基本运
时间:2020-12-29
-
Android数据存储(一)SQL
时间:2020-12-29
-
iOS开发数据库SQLite的使用
时间:2020-12-29
-
Android数据存储(三) SQ
时间:2020-12-29
-
SQLite数据库与Contentprovid
时间:2020-12-29
-
SQLite数据库管理系统-我所
时间:2020-12-28
-
SQLite数据库常用语句及M
时间:2020-12-24
-
sQlite常用语句以及sQlite
时间:2020-12-24
热门文章
-
sQlite常用语句以及sQlite developer的使用与注
时间:2020-12-24
-
SQLite数据库管理系统-我所认识的数据库引
时间:2020-12-28
-
Androidsqlite增删改查基本运用
时间:2020-12-29
-
Android数据存储(一)SQLite
时间:2020-12-29
-
iOS开发数据库SQLite的使用
时间:2020-12-29
-
Android数据存储(三) SQLite数据库存储
时间:2020-12-29
-
SQLite数据库常用语句及MAC上的SQLite可视化
时间:2020-12-24
-
SQLite教程(一):SQLite数据库介绍
时间:2020-12-24
-
SQLite数据库与Contentprovider(2)
时间:2020-12-29
