我已经创建了一个新的SQLLite数据库通过一个PHP脚本为一个快速的MVP。
在将数据库结构与传递给我的文件进行比较时,我可以理解我的新数据库中缺少一些sys/*表。已经注意到了使用DB Browser for SQLLite的差异
我一直在通读SQLLite文档,似乎只有一个sys表- sysmaster -可以隐式查询。
所以我的问题是,像sys/version之类的其他表是什么?是否需要它们?它们是否指的是以前版本的SQLite (例如v2)?
谢谢
发布于 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)。
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

即已经创建了Sqlite表sqlite_stat1,sqlite_sequence和sqlite_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节。
https://stackoverflow.com/questions/56457927
复制相似问题