每个SQLite数据库都包含一个“模式表”,用于存储该数据库的架构。数据库的模式是对数据库中包含的所有其他表,索引,触发器和视图的描述。模式表如下所示:
创建表sqlite_schema( 输入文字, 命名文字, tbl_name文字, 根页整数, sql文本 );
sqlite_schema表针对架构中的每个表,索引,视图和触发器(统称为“对象”)包含一行,但sqlite_schema表本身没有条目。有关SQLite如何在内部使用sqlite_schema表的其他信息,请参见文件格式文档的 模式存储小节。
可以始终使用名称“ sqlite_schema”来引用模式表,尤其是如果通过模式名称(例如“ main.sqlite_schema”或“ temp.sqlite_schema”)来限定时。但是出于历史兼容性,还可以识别一些备用名称,包括:
备选方案(2)和(3)仅适用于与每个数据库连接关联的TEMP数据库,而备选方案(1)在任何地方都有效。由于历史原因,来自sqlite3_set_authorizer() 接口的回调始终使用名称(1)或(3)引用架构表。
模式表的字段的含义如下:
sqlite_schema.type列将是以下文本字符串之一:“ table”,“ index”,“ view”或“ trigger”(根据定义的对象类型)。'table'字符串用于普通表和虚拟表。
sqlite_schema.name列将保存对象的名称。(对表的UNIQUE和PRIMARY KEY约束使SQLite创建 名称形式为“ sqlite_autoindex_TABLE_N”的内部索引,其中TABLE替换为包含约束的表的名称,并且N是一个以1开头并以1递增的整数。在WITHOUT ROWID表中没有PRIMARY KEY的sqlite_schema条目,但为PRIMARY KEY保留了“ sqlite_autoindex_TABLE_N”名称,就像sqlite_schema条目确实存在一样。随后的UNIQUE约束。“ sqlite_autoindex_TABLE_N” ,无论是在rowid表中还是在WITHOUT ROWID表中。
sqlite_schema.tbl_name列包含与该对象关联的表或视图的名称。对于表或视图,tbl_name列是name列的副本。对于索引,tbl_name是被索引表的名称。对于触发器,tbl_name列存储导致触发器触发的表或视图的名称。
sqlite_schema.rootpage列存储表和索引的根b树页面的页码。对于定义视图,触发器和虚拟表的行,根页列为0或NULL。
sqlite_schema.sql列存储描述对象的SQL文本。该SQL文本是CREATE TABLE,CREATE VIRTUAL TABLE, CREATE INDEX, CREATE VIEW或CREATE TRIGGER语句,如果针对数据库文件进行评估(如果它是数据库连接的主数据库), 则会重新创建该对象。文本通常是用于创建对象的原始语句的副本,但是应用了规范化,因此文本符合以下规则:
sqlite_schema.sql列中的文本是创建对象的原始CREATE语句文本的副本,但如上所述和通过后续ALTER TABLE语句进行了修改的规范除外。对于由UNIQUE或PRIMARY KEY约束自动创建的内部索引,sqlite_schema.sql为NULL 。