为什么SQLite会创建空sqlite_sequence表?

Why does SQLite create empty sqlite_sequence table?

提问人:MartinL 提问时间:8/6/2019 最后编辑:Super Kai - Kazuya ItoMartinL 更新时间:10/23/2023 访问量:6839

问:

我有一个包含多个表的数据库,其中第一个字段定义为:

'ID' INTEGER NOT NULL UNIQUE ... PRIMARY_KEY('ID')

我没有对这些表中的任何一个使用 AUTOINCREMENT 关键字,但我的数据库包含一个我无法删除的空sqlite_sequence表。如果将 ID 字段的 NULL 值插入到这些表中,则会为 ID 字段生成默认增量值,但不会填充或更新sqlite_sequence表。有什么方法可以将这些表的最后插入的 rowid 值重置为 0?

SQL 数据库 SQLITE 序列 自动增量

评论

6赞 forpas 8/6/2019
当您将整数列定义为PRIMARY_KEY时,它也是 AUTOINCREMENT。在这里阅读更多: sqlite.org/autoinc.html
1赞 Shawn 8/6/2019
UNIQUE顺便说一句,在主键列上是冗余且毫无意义的。
4赞 Shawn 8/6/2019
它是一个内部表(就像所有以它开头的表一样,一旦系统创建了它,就无法显式删除。sqlite.org/fileformat2.html#the_sqlite_sequence_tablesqlite_
1赞 Raymond Nijland 8/6/2019
我相信一个简单的命令可以做到这一点,但重置/更改序列在大多数情况下是一个坏主意。UPDATE
1赞 Shawn 8/6/2019
在不带 的 rowid 表中,将根据表中当前存在的最大 rowid 计算新的 rowid。有关该算法的完整说明,请参阅 forpas 提供的链接。TL的;DR:通过删除表中的所有行来重置它。AUTOINCREMENT

答:

0赞 Super Kai - Kazuya Ito 10/5/2023 #1

根据下面的 SQL,我认为您创建了具有 UNIQUE 的表sqlite_sequence而不是使用 AUTOINCREMENT 创建的表。* 除非您创建包含列的表,否则永远不会创建表。sqlite_autoindex_...sqlite_sequenceAUTOINCREMENT

ID' INTEGER NOT NULL 唯一 ...PRIMARY_KEY('ID')

文档如下:

不要将自动索引与内部索引(名称类似于“sqlite_autoindex_table_N”)混淆,这些内部索引有时是为了实现 PRIMARY KEY 约束或 UNIQUE 约束而创建的。

例如,您创建的表具有如下所示的列:testidTEXT PRIMARY KEYTEXT UNIQUE

CREATE TABLE test (
  id TEXT PRIMARY KEY
);

艺术

CREATE TABLE test (
  id TEXT UNIQUE
);

然后,创建如下所示的表。*我的回答解释了如何显示列名:sqlite_autoindex_test_1

sqlite> .headers on
sqlite> .mode box
sqlite> SELECT name FROM sqlite_master;
┌───────┬─────────────────────────┐
│ type  │          name           │
├───────┼─────────────────────────┤
│ table │ test                    │
│ index │ sqlite_autoindex_test_1 │
└───────┴─────────────────────────┘

此外,您创建的表具有如下所示的列:testidINTEGER PRIMARY KEY

CREATE TABLE test (
  id INTEGER PRIMARY KEY
);

然后,不创建如下所示的表。sqlite_autoindex_test_1

sqlite> .headers on
sqlite> .mode box
sqlite> SELECT type, name FROM sqlite_master; 
┌───────┬──────┐
│ type  │ name │
├───────┼──────┤
│ table │ test │
└───────┴──────┘

但是,您创建的表具有如下所示的列:testidINTEGER UNIQUE

CREATE TABLE test (
  id INTEGER UNIQUE
);

然后,创建表格,如下所示:sqlite_autoindex_test_1

sqlite> .headers on
sqlite> .mode box
sqlite> SELECT name FROM sqlite_master;
┌───────┬─────────────────────────┐
│ type  │          name           │
├───────┼─────────────────────────┤
│ table │ test                    │
│ index │ sqlite_autoindex_test_1 │
└───────┴─────────────────────────┘