SQLLite系统表

时间:2019-06-05 09:37:43

标签: sqlite

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

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

可以发现差异

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

所以我的问题是,这些其他表是sys / version还是类似的东西? 他们需要吗?它们是否引用了SQLite的早期版本(例如v2)?

谢谢

1 个答案:

答案 0 :(得分:2)

  

在将数据库结构与已传递的文件进行比较时   对我来说,我很感谢缺少一些sys / *表   从我的新数据库中丢失了。

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

  

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

所有SQLite系统表均以 sqlite _

开头

唯一必须存在的是 sqlite_master ,这是数据库的架构。

其他人可能按照:-

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

sqlite_sequence 将存在。

sqlite_statn (其中n是1-4的数字)在运行ANALYZE时创建。

  • stat2-4取决于编译选项,并且通常在ANALAYZE之后不存在。

sqlite_autoindex _ * ????是在使用UNIQUE和PRIMARY KEY约束而不是 rowid

的别名时创建的

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

sqlite_master 不能更改,例如尝试运行:-

INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)');

结果:-

INSERT INTO sqlite_master VALUES('table','ooops','ooops','CREATE TABLE ooops (COL1 TEXT)')
> table sqlite_master may not be modified
> Time: 0s

也许考虑以下几点:-

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

enter image description here

即已创建Sqlite表 sqlite_stat1 sqlite_sequence sqlite_autoindex_mytable1_1

结果2

enter image description here

sqlite_stat1 为空(无需进行任何分析)

结果3

enter image description here

sqlite_sequence 为空(未将行插入到mytable1中)

结果4

在mytable1中插入3行后 sqlite_sequence 在mytable1中有一行,其seq值为3(最后插入的rowid)。

enter image description here

结果5

将seq值也更新100后,将另外3行添加到mytable1中,seq数已增加到103

enter image description here

结果6

mytable 具有预期的6行,但 id (rowid列的别名)在3到100之后跳了(因为 sqlite_sequence 已更改):-

enter image description here

  

所以我的问题是,这些其他表是sys / version还是   像那样的东西?他们需要吗?他们是否参考以前的版本   SQLite(例如v2)?

希望以上回答最多。但作为总结,也许让SQLite管理它的系统表。您可能希望阅读Database File Format - 2.6.1. Internal Schema Objects至第3节。

相关问题