每個 SQLite 資料庫都包含一個「架構表」,用於儲存該資料庫的架構。資料庫的架構描述了資料庫中所包含的所有其他表格、索引、觸發器和檢視。架構表如下所示
CREATE TABLE sqlite_schema( type text, name text, tbl_name text, rootpage integer, sql text );
sqlite_schema 表包含架構中每個表格、索引、檢視和觸發器(統稱為「物件」)的一列,但 sqlite_schema 表本身沒有條目。請參閱 架構儲存 小節的 檔案格式 文件,以取得有關 SQLite 如何在內部使用 sqlite_schema 表的更多資訊。
架構表可以使用名稱「sqlite_schema」隨時參考,特別是如果由架構名稱限定,例如「main.sqlite_schema」或「temp.sqlite_schema」。但為了歷史相容性,也識別一些其他名稱,包括
其他名稱 (2) 和 (3) 僅適用於與每個資料庫連線關聯的 TEMP 資料庫,但其他名稱 (1) 可用於任何地方。由於歷史原因,sqlite3_set_authorizer() 介面的回呼總是使用名稱 (1) 或 (3) 參考架構表。
Schema 表格欄位的意義如下
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 項目,但 "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。
sqlite_schema.sql 欄位儲存描述物件的 SQL 文字。此 SQL 文字是 CREATE TABLE、CREATE VIRTUAL TABLE、CREATE INDEX、CREATE VIEW 或 CREATE TRIGGER 陳述式,如果在資料庫檔案中評估,當它是 資料庫連線 的主資料庫時,將重新建立物件。文字通常是建立物件所使用的原始陳述式的副本,但套用正規化,使文字符合下列規則
sqlite_schema.sql 欄位中的文字是建立物件的原始 CREATE 陳述式文字的副本,但已套用上述正規化,並修改為後續 ALTER TABLE 陳述式。sqlite_schema.sql 對 內部索引 為 NULL,這些索引是由 UNIQUE 或 PRIMARY KEY 約束自動建立的。
SQLite 在建立資料庫時建立 schema 表,並在 SQLite 使用者提交 DDL 陳述式執行時修改其內容。在正常情況下,使用者不需要修改它,而且如果他們修改它,則有 資料庫損毀 的風險。
此頁面最後修改於 2023-06-16 10:11:06 UTC