提问人:MartinL 提问时间:8/6/2019 最后编辑:Super Kai - Kazuya ItoMartinL 更新时间:10/23/2023 访问量:6839
为什么SQLite会创建空sqlite_sequence表?
Why does SQLite create empty sqlite_sequence table?
问:
我有一个包含多个表的数据库,其中第一个字段定义为:
'ID' INTEGER NOT NULL UNIQUE ... PRIMARY_KEY('ID')
我没有对这些表中的任何一个使用 AUTOINCREMENT 关键字,但我的数据库包含一个我无法删除的空sqlite_sequence表。如果将 ID 字段的 NULL 值插入到这些表中,则会为 ID 字段生成默认增量值,但不会填充或更新sqlite_sequence表。有什么方法可以将这些表的最后插入的 rowid 值重置为 0?
答:
根据下面的 SQL,我认为您创建了具有 UNIQUE 的表sqlite_sequence而不是使用 AUTOINCREMENT 创建的表。* 除非您创建包含列的表,否则永远不会创建表。sqlite_autoindex_...
sqlite_sequence
AUTOINCREMENT
ID' INTEGER NOT NULL 唯一 ...PRIMARY_KEY('ID')
文档如下:
不要将自动索引与内部索引(名称类似于“sqlite_autoindex_table_N”)混淆,这些内部索引有时是为了实现 PRIMARY KEY 约束或 UNIQUE 约束而创建的。
例如,您创建的表具有如下所示的列:test
id
TEXT PRIMARY KEY
TEXT 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 │
└───────┴─────────────────────────┘
此外,您创建的表具有如下所示的列:test
id
INTEGER 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 │
└───────┴──────┘
但是,您创建的表具有如下所示的列:test
id
INTEGER 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 │
└───────┴─────────────────────────┘
下一个:哈希函数对元素顺序不敏感
评论
UNIQUE
顺便说一句,在主键列上是冗余且毫无意义的。sqlite_
UPDATE
AUTOINCREMENT