小巧、快速、可靠。
任選三項。
架構表

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. Schema 表格的詮釋

Schema 表格欄位的意義如下

type

sqlite_schema.type 欄位將會是下列文字字串之一:'table'、'index'、'view' 或 'trigger',依據所定義物件的類型。'table' 字串用於一般和 虛擬表格

name

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 表格中。

tbl_name

sqlite_schema.tbl_name 欄位儲存物件關聯的表格或檢視的名稱。對於表格或檢視,tbl_name 欄位是 name 欄位的副本。對於索引,tbl_name 是被索引的表格名稱。對於觸發器,tbl_name 欄位儲存會導致觸發器觸發的表格或檢視名稱。

rootpage

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 關鍵字轉換為全部大寫字母。
  • 如果 TEMP 或 TEMPORARY 關鍵字出現在初始 CREATE 關鍵字之後,則將其移除。
  • 在要建立的物件名稱之前出現的任何資料庫名稱限定詞都會移除。
  • 移除開頭的空格。
  • 前兩個關鍵字之後的所有空格都轉換為單一空格。

sqlite_schema.sql 欄位中的文字是建立物件的原始 CREATE 陳述式文字的副本,但已套用上述正規化,並修改為後續 ALTER TABLE 陳述式。sqlite_schema.sql 對 內部索引 為 NULL,這些索引是由 UNIQUEPRIMARY KEY 約束自動建立的。

4. 建立和修改 Schema 表

SQLite 在建立資料庫時建立 schema 表,並在 SQLite 使用者提交 DDL 陳述式執行時修改其內容。在正常情況下,使用者不需要修改它,而且如果他們修改它,則有 資料庫損毀 的風險。

此頁面最後修改於 2023-06-16 10:11:06 UTC