最輕巧的數據庫SQLite學習記錄 之高級教程 Day03

1、SQLite PRAGMA

SQLite 的 PRAGMA 命令是一個特殊的命令,可以用在 SQLite 環境內控制各種環境變量和狀態標誌。一個 PRAGMA 值可以被讀取,也可以根據需求進行設置。

語法

要查詢當前的 PRAGMA 值,只需要提供該 pragma 的名字:

PRAGMA pragma_name;

要爲 PRAGMA 設置一個新的值,語法如下:

PRAGMA pragma_name = value;

設置模式,可以是名稱或等值的整數,但返回的值將始終是一個整數。

auto_vacuum Pragma

auto_vacuum Pragma 獲取或設置 auto-vacuum 模式。語法如下:

PRAGMA [database.]auto_vacuum;
PRAGMA [database.]auto_vacuum = mode;

其中,mode 可以是以下任何一種:

 Pragma 值 描述
0 或 NONE禁用 Auto-vacuum。這是默認模式,意味着數據庫文件尺寸大小不會縮小,除非手動使用 VACUUM 命令。
1 或 FULL啓用 Auto-vacuum,是全自動的。在該模式下,允許數據庫文件隨着數據從數據庫移除而縮小。
2 或 INCREMENTAL啓用 Auto-vacuum,但是必須手動激活。在該模式下,引用數據被維持,免費頁面只放在免費列表中。這些頁面可在任何時候使用 incremental_vacuum pragma 進行覆蓋。

cache_size Pragma

cache_size Pragma 可獲取或暫時設置在內存中頁面緩存的最大尺寸。語法如下:

PRAGMA [database.]cache_size;
PRAGMA [database.]cache_size = pages;

pages 值表示在緩存中的頁面數。內置頁面緩存的默認大小爲 2,000 頁,最小尺寸爲 10 頁。

case_sensitive_like Pragma

case_sensitive_like Pragma 控制內置的 LIKE 表達式的大小寫敏感度。默認情況下,該 Pragma 爲 false,這意味着,內置的 LIKE 操作符忽略字母的大小寫。語法如下:

PRAGMA case_sensitive_like = [true|false];

目前沒有辦法查詢該 Pragma 的當前狀態。

count_changes Pragma

count_changes Pragma 獲取或設置數據操作語句的返回值,如 INSERT、UPDATE 和 DELETE。語法如下:

PRAGMA count_changes;
PRAGMA count_changes = [true|false];

默認情況下,該 Pragma 爲 false,這些語句不返回任何東西。如果設置爲 true,每個所提到的語句將返回一個單行單列的表,由一個單一的整數值組成,該整數表示操作影響的行。

database_list Pragma

database_list Pragma 將用於列出了所有的數據庫連接。語法如下:

PRAGMA database_list;

該 Pragma 將返回一個單行三列的表格,每當打開或附加數據庫時,會給出數據庫中的序列號,它的名稱和相關的文件。

encoding Pragma

encoding Pragma 控制字符串如何編碼及存儲在數據庫文件中。語法如下:

PRAGMA encoding;
PRAGMA encoding = format;

格式值可以是 UTF-8、UTF-16le 或 UTF-16be 之一。

freelist_count Pragma

freelist_count Pragma 返回一個整數,表示當前被標記爲免費和可用的數據庫頁數。語法如下:

 Pragma 返回一個整數,表示當前被標記爲免費和可用的數據庫頁數。語法如下:

index_info Pragma

index_info Pragma 返回關於數據庫索引的信息。語法如下:

PRAGMA [database.]index_info( index_name );

結果集將爲每個包含在給出列序列的索引、表格內的列索引、列名稱的列顯示一行。

index_list Pragma

index_list Pragma 列出所有與表相關聯的索引。語法如下:

PRAGMA [database.]index_list( table_name );

結果集將爲每個給出列序列的索引、索引名稱、表示索引是否唯一的標識顯示一行。

journal_mode Pragma

journal_mode Pragma 獲取或設置控制日誌文件如何存儲和處理的日誌模式。語法如下::

PRAGMA journal_mode;
PRAGMA journal_mode = mode;
PRAGMA database.journal_mode;
PRAGMA database.journal_mode = mode;

這裏支持五種日誌模式:

Pragma 值描述
DELETE默認模式。在該模式下,在事務結束時,日誌文件將被刪除。
TRUNCATE日誌文件被階段爲零字節長度。
PERSIST日誌文件被留在原地,但頭部被重寫,表明日誌不再有效。
MEMORY日誌記錄保留在內存中,而不是磁盤上。
OFF不保留任何日誌記錄。

max_page_count Pragma

max_page_count Pragma 爲數據庫獲取或設置允許的最大頁數。語法如下:

PRAGMA [database.]max_page_count;
PRAGMA [database.]max_page_count = max_page;

默認值是 1,073,741,823,這是一個千兆的頁面,即如果默認 1 KB 的頁面大小,那麼數據庫中增長起來的一個兆字節

page_count Pragma

page_count Pragma 返回當前數據庫中的網頁數量。語法如下:

PRAGMA [database.]page_count;

數據庫文件的大小應該是 page_count * page_size。

page_size Pragma

page_size Pragma 獲取或設置數據庫頁面的大小。語法如下:

PRAGMA [database.]page_size;
PRAGMA [database.]page_size = bytes;

默認情況下,允許的尺寸是 512、1024、2048、4096、8192、16384、32768 字節。改變現有數據庫頁面大小的唯一方法就是設置頁面大小,然後立即 VACUUM 該數據庫。

parser_trace Pragma

parser_trace Pragma 隨着它解析 SQL 命令來控制打印的調試狀態,語法如下:

PRAGMA parser_trace = [true|false];

默認情況下,它被設置爲 false,但設置爲 true 時則啓用,此時 SQL 解析器會隨着它解析 SQL 命令來打印出它的狀態。

recursive_triggers Pragma

recursive_triggers Pragma 獲取或設置遞歸觸發器功能。如果未啓用遞歸觸發器,一個觸發動作將不會觸發另一個觸發。語法如下:

PRAGMA recursive_triggers;
PRAGMA recursive_triggers = [true|false];

schema_version Pragma

schema_version Pragma 獲取或設置存儲在數據庫頭中的的架構版本值。語法如下:

PRAGMA [database.]schema_version;
PRAGMA [database.]schema_version = number;

這是一個 32 位有符號整數值,用來跟蹤架構的變化。每當一個架構改變命令執行(比如 CREATE... 或 DROP...)時,這個值會遞增。

secure_delete Pragma

secure_delete Pragma 用來控制內容是如何從數據庫中刪除。語法如下:

PRAGMA secure_delete;
PRAGMA secure_delete = [true|false];
PRAGMA database.secure_delete;
PRAGMA database.secure_delete = [true|false];

安全刪除標誌的默認值通常是關閉的,但是這是可以通過 SQLITE_SECURE_DELETE 構建選項來改變的。

sql_trace Pragma

sql_trace Pragma 用於把 SQL 跟蹤結果轉儲到屏幕上。語法如下:

PRAGMA sql_trace;
PRAGMA sql_trace = [true|false];

SQLite 必須通過 SQLITE_DEBUG 指令來編譯要引用的該 Pragma。

synchronous Pragma

synchronous Pragma 獲取或設置當前磁盤的同步模式,該模式控制積極的 SQLite 如何將數據寫入物理存儲。語法如下:

PRAGMA [database.]synchronous;
PRAGMA [database.]synchronous = mode;

SQLite 支持下列同步模式:

Pragma 值描述
0 或 OFF不進行同步。
1 或 NORMAL在關鍵的磁盤操作的每個序列後同步。
2 或 FULL在每個關鍵的磁盤操作後同步。

temp_store Pragma

temp_store Pragma 獲取或設置臨時數據庫文件所使用的存儲模式。語法如下:

PRAGMA temp_store;
PRAGMA temp_store = mode;

SQLite 支持下列存儲模式:

Pragma 值描述
0 或 DEFAULT默認使用編譯時的模式。通常是 FILE。
1 或 FILE使用基於文件的存儲。
2 或 MEMORY使用基於內存的存儲。

temp_store_directory Pragma

temp_store_directory Pragma 獲取或設置用於臨時數據庫文件的位置。語法如下:

PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory_path';

user_version Pragma

user_version Pragma 獲取或設置存儲在數據庫頭的用戶自定義的版本值。語法如下:

PRAGMA [database.]user_version;
PRAGMA [database.]user_version = number;

這是一個 32 位的有符號整數值,可以由開發人員設置,用於版本跟蹤的目的。

writable_schema Pragma

writable_schema Pragma 獲取或設置是否能夠修改系統表。語法如下:

PRAGMA writable_schema;
PRAGMA writable_schema = [true|false];

如果設置了該 Pragma,則表以 sqlite_ 開始,可以創建和修改,包括 sqlite_master 表。使用該 Pragma 時要注意,因爲它可能導致整個數據庫損壞。

2、SQLite 約束

約束是在表的數據列上強制執行的規則。這些是用來限制可以插入到表中的數據類型。這確保了數據庫中數據的準確性和可靠性。

約束可以是列級或表級。列級約束僅適用於列,表級約束被應用到整個表。

以下是在 SQLite 中常用的約束。

  • NOT NULL 約束:確保某列不能有 NULL 值。

  • DEFAULT 約束:當某列沒有指定值時,爲該列提供默認值。

  • UNIQUE 約束:確保某列中的所有值是不同的。

  • PRIMARY Key 約束:唯一標識數據庫表中的各行/記錄。

  • CHECK 約束:CHECK 約束確保某列中的所有值滿足一定條件。

NOT NULL 約束

默認情況下,列可以保存 NULL 值。如果您不想某列有 NULL 值,那麼需要在該列上定義此約束,指定在該列上不允許 NULL 值。

NULL 與沒有數據是不一樣的,它代表着未知的數據。

實例

例如,下面的 SQLite 語句創建一個新的表 COMPANY,並增加了五列,其中 ID、NAME 和 AGE 三列指定不接受 NULL 值:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

DEFAULT 約束

DEFAULT 約束在 INSERT INTO 語句沒有提供一個特定的值時,爲列提供一個默認值。

實例

例如,下面的 SQLite 語句創建一個新的表 COMPANY,並增加了五列。在這裏,SALARY 列默認設置爲 5000.00。所以當 INSERT INTO 語句沒有爲該列提供值時,該列將被設置爲 5000.00。

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

UNIQUE 約束

UNIQUE 約束防止在一個特定的列存在兩個記錄具有相同的值。在 COMPANY 表中,例如,您可能要防止兩個或兩個以上的人具有相同的年齡。

實例

例如,下面的 SQLite 語句創建一個新的表 COMPANY,並增加了五列。在這裏,AGE 列設置爲 UNIQUE,所以不能有兩個相同年齡的記錄:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識數據庫表中的每個記錄。在一個表中可以有多個 UNIQUE 列,但只能有一個主鍵。在設計數據庫表時,主鍵是很重要的。主鍵是唯一的 ID。

我們使用主鍵來引用表中的行。可通過把主鍵設置爲其他表的外鍵,來創建表之間的關係。由於"長期存在編碼監督",在 SQLite 中,主鍵可以是 NULL,這是與其他數據庫不同的地方。

主鍵是表中的一個字段,唯一標識數據庫表中的各行/記錄。主鍵必須包含唯一值。主鍵列不能有 NULL 值。

一個表只能有一個主鍵,它可以由一個或多個字段組成。當多個字段作爲主鍵,它們被稱爲複合鍵

如果一個表在任何字段上定義了一個主鍵,那麼在這些字段上不能有兩個記錄具有相同的值。

CHECK 約束

CHECK 約束啓用輸入一條記錄要檢查值的條件。如果條件值爲 false,則記錄違反了約束,且不能輸入到表。

實例

例如,下面的 SQLite 創建一個新的表 COMPANY,並增加了五列。在這裏,我們爲 SALARY 列添加 CHECK,所以工資不能爲零:

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

刪除約束

SQLite 支持 ALTER TABLE 的有限子集。在 SQLite 中,ALTER TABLE 命令允許用戶重命名錶,或向現有表添加一個新的列。重命名列,刪除一列,或從一個表中添加或刪除約束都是不可能的。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章