服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Sqlite - SQLite3中自增主键相关知识总结

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

2020-06-07 17:44SQLite教程网 Sqlite

这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下

一、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值,但看不到。

延伸 · 阅读

精彩推荐
  • Sqlite初识SQLITE3数据库

    初识SQLITE3数据库

    本文主要讲诉Sqlite数据库的一些基本概念以及SQLite的优势,需要的朋友可以参考下 ...

    SQLITE教程网3192020-06-07
  • SqliteSQLite学习手册(SQLite在线备份)

    SQLite学习手册(SQLite在线备份)

    在SQLite中提供了一组用于在线数据库备份的APIs函数(C接口),可以很好的解决上述方法存在的不足。通过该组函数,可以将源数据库中的内容拷贝到另一个数...

    SQLite教程网5412020-06-06
  • SqliteSQLite优化方法

    SQLite优化方法

    SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极...

    SQLite教程网4022020-06-01
  • SqliteSQLite教程(一):SQLite数据库介绍

    SQLite教程(一):SQLite数据库介绍

    这篇文章主要介绍了SQLite教程(一):SQLite数据库介绍,本文讲解了什么是SQLite、SQLite的主要优点、和RDBMS相比SQLite的一些劣势、个性化特征等内容,需要的朋...

    ZZVIPS6512020-06-08
  • SqliteSQLite教程(四):内置函数

    SQLite教程(四):内置函数

    这篇文章主要介绍了SQLite教程(四):内置函数,本文讲解了聚合函数、核心函数、日期和时间函数、,需要的朋友可以参考下 ...

    SQLite教程网4282020-06-09
  • SqliteSQLite 实现if not exist 类似功能的操作

    SQLite 实现if not exist 类似功能的操作

    这篇文章主要介绍了SQLite 实现if not exist 类似功能的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    吉普赛的歌11642021-02-06
  • SqliteSQLite教程(五):索引和数据分析/清理

    SQLite教程(五):索引和数据分析/清理

    这篇文章主要介绍了SQLite教程(五):索引和数据分析/清理,本文讲解了创建索引、删除索引、重建索引、数据分析、数据清理等内容,需要的朋友可以参考...

    数据库之家5622020-06-09
  • Sqlitesqlite迁移到mysql脚本的方法

    sqlite迁移到mysql脚本的方法

    这篇文章主要介绍了sqlite迁移到mysql脚本的方法,需要的朋友可以参考下 ...

    sqlite教程网4832020-08-05