小巧。快速。可靠。
三选二。
模式表

1. 简介

每个 SQLite 数据库都包含一个“模式表”,用于存储该数据库的模式。数据库的模式是对数据库中包含的所有其他表、索引、触发器和视图的描述。模式表如下所示

CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);

sqlite_schema 表中包含数据库模式中每个表、索引、视图和触发器(统称为“对象”)的一行,但 sqlite_schema 表本身没有条目。有关 SQLite 如何在内部使用 sqlite_schema 表的更多信息,请参阅文件格式文档的模式存储小节。

2. 其他名称

模式表始终可以使用名称“sqlite_schema”进行引用,尤其是在使用模式名称限定时,例如“main.sqlite_schema”或“temp.sqlite_schema”。但为了保持向后兼容性,也识别一些其他名称,包括

  1. sqlite_master
  2. sqlite_temp_schema
  3. sqlite_temp_master

替代方案 (2) 和 (3) 仅适用于与每个数据库连接关联的 TEMP 数据库,但替代方案 (1) 可以在任何地方使用。出于历史原因,来自sqlite3_set_authorizer()接口的回调始终使用名称 (1) 或 (3) 来引用模式表。

3. 模式表的解读

模式表字段的含义如下

类型

sqlite_schema.type 列将是以下文本字符串之一:'table'、'index'、'view' 或 'trigger',具体取决于定义的对象类型。'table' 字符串用于普通表和虚拟表

名称

sqlite_schema.name 列将保存对象的名称。UNIQUEPRIMARY KEY 表约束会导致 SQLite 创建名称格式为“sqlite_autoindex_TABLE_N”的内部索引,其中 TABLE 被替换为包含约束的表的名称,而 N 是从 1 开始的整数,并且在表定义中看到每个约束时递增 1。在WITHOUT ROWID 表中,PRIMARY KEY 没有 sqlite_schema 条目,但“sqlite_autoindex_TABLE_N”名称被保留用于 PRIMARY KEY,就像 sqlite_schema 条目存在一样。这将影响后续 UNIQUE 约束的编号。“sqlite_autoindex_TABLE_N”名称从不分配给INTEGER PRIMARY KEY,无论是在 rowid 表中还是在 WITHOUT ROWID 表中。

表名

sqlite_schema.tbl_name 列保存与对象关联的表或视图的名称。对于表或视图,tbl_name 列是 name 列的副本。对于索引,tbl_name 是被索引的表的名称。对于触发器,tbl_name 列存储导致触发器触发的表或视图的名称。

根页面

sqlite_schema.rootpage 列存储表和索引的根 B 树页面的页码。对于定义视图、触发器和虚拟表的行,rootpage 列为 0 或 NULL。

SQL

sqlite_schema.sql 列存储描述对象的 SQL 文本。此 SQL 文本是CREATE TABLECREATE VIRTUAL TABLECREATE INDEXCREATE VIEWCREATE TRIGGER 语句,如果在数据库文件为数据库连接的主数据库时对此数据库文件进行评估,则会重新创建对象。该文本通常是用于创建对象的原始语句的副本,但应用了规范化,以便文本符合以下规则

  • 语句开头的 CREATE、TABLE、VIEW、TRIGGER 和 INDEX 关键字转换为全部大写字母。
  • 如果在初始 CREATE 关键字之后出现 TEMP 或 TEMPORARY 关键字,则将其删除。
  • 删除在要创建的对象名称之前出现的任何数据库名称限定符。
  • 删除前导空格。
  • 将前两个关键字之后的任何空格转换为单个空格。

sqlite_schema.sql 列中的文本是创建对象的原始 CREATE 语句文本的副本,除了如上所述进行规范化以及由后续ALTER TABLE 语句修改外。对于由UNIQUEPRIMARY KEY 约束自动创建的内部索引,sqlite_schema.sql 为 NULL。

4. 模式表的创建和修改

SQLite 在数据库创建时创建模式表,并在 SQLite 用户提交 DDL 语句以供执行时修改其内容。在正常情况下,用户无需修改它,如果他们修改它,则存在数据库损坏的风险。

此页面上次修改于2023-06-16 10:11:06 UTC