首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLLite系统表

SQLLite系统表
EN

Stack Overflow用户
提问于 2019-06-05 17:37:44
回答 1查看 262关注 0票数 0

我已经创建了一个新的SQLLite数据库通过一个PHP脚本为一个快速的MVP。

在将数据库结构与传递给我的文件进行比较时,我可以理解我的新数据库中缺少一些sys/*表。已经注意到了使用DB Browser for SQLLite的差异

我一直在通读SQLLite文档,似乎只有一个sys表- sysmaster -可以隐式查询。

所以我的问题是,像sys/version之类的其他表是什么?是否需要它们?它们是否指的是以前版本的SQLite (例如v2)?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-06-05 19:39:22

在将数据库结构与传递给我的文件进行比较时,我可以理解我的新数据库中缺少一些sys/*表。

sys表不是SQLite系统表,因此是用户定义的表。

我一直在通读SQLLite文档,似乎只有一个sys表- sysmaster -可以隐式查询。

所有SQLite系统表都以sqlite_开头

唯一必须存在的是sqlite_master,,这是数据库的模式。

其他可能存在的情况如下:

如果任何表包含AUTOINCREMENT关键字(仅限于用于rowid列的别名),则sqlite_sequence将存在。

运行分析时会创建sqlite_statn (其中n是数字1-4)。

  • stat2-4依赖于编译选项,通常不会在分析之后发送。

sqlite_autoindex_*???在使用UNIQUE和PRIMARY KEY约束而不是rowid的别名时创建

SQLite系统表都是隐式访问的,也可以访问所有表,甚至可以更改某些表(风险自负)。

无法更改sqlite_master,例如正在尝试运行:-

代码语言:javascript
复制
INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)');

结果如下:

代码语言:javascript
复制
INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)')
> table sqlite_master may not be modified
> Time: 0s

或许可以考虑以下几点:

代码语言:javascript
复制
DROP TABLE IF EXISTS mytable1;
CREATE TABLE IF NOT EXISTS mytable1 (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- autoincrement results in sqlite_sequence being created
    COL1 TEXT UNIQUE -- UNIQUE results in an sqlite_autoindex table being created
    );
ANALYZE; -- will result in sqlite_stat1 being created
SELECT * FROM sqlite_master; -- RESULT1
SELECT * FROM sqlite_stat1; -- RESULT2
SELECT * FROM sqlite_sequence; -- RESULT3
INSERT INTO mytable1 (COL1) VALUES ('A'),('B'),('C'); -- will result in sqlite_sequence being updated
SELECT * FROM sqlite_sequence; -- RESULT4
UPDATE sqlite_sequence SET seq = 100 WHERE name = 'mytable1'; -- naughty
INSERT INTO mytable1 (COL1) VALUES ('X'),('Y'),('Z');
SELECT * FROM sqlite_sequence; -- RESULT5
SELECT * FROM mytable1; -- RESULT6

查询的结果如下:

结果1

即已经创建了Sqlite表sqlite_stat1sqlite_sequencesqlite_autoindex_mytable1_1

结果2

例如,sqlite_stat1为空(没有要分析的内容)

结果3

sqlite_sequence为空(尚未在mytable1中插入任何行)

结果4

在insert 3 rows insert mytable1之后,sqlite_sequence有一个用于mytable1的行,序列值是3(插入的最后一个行is )。

结果5

在更新了SEQ值100之后,又向mytable1添加了3行,序列号已增加到103

结果6

并且mytable有预期的6行,但是id (行id列的别名)在3到100之后跳到了100(因为修改了表) :-

我的问题是,像sys/

之类的其他表是什么?是否需要它们?它们是否指的是以前版本的SQLite (例如v2)?

希望上面已经回答了大部分问题。但也许作为总结,让SQLite来管理它的系统表。您可能希望阅读Database File Format - 2.6.1. Internal Schema Objects直到第3节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56457927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档