小巧。快速。可靠。
三者选其二。

PRAGMA 语句

PRAGMA 语句是 SQLite 特定的 SQL 扩展,用于修改 SQLite 库的操作或查询 SQLite 库的内部(非表格)数据。PRAGMA 语句使用与其他 SQLite 命令(例如 SELECTINSERT)相同的接口发出,但在以下重要方面有所不同

SQLite 的 C 语言 API 提供了 SQLITE_FCNTL_PRAGMA 文件控制,它使 VFS 实现有机会添加新的 PRAGMA 语句或覆盖内置 PRAGMA 语句的含义。


PRAGMA 命令语法

pragma-stmt

PRAGMA schema-name . pragma-name ( pragma-value ) = pragma-value

pragma-value

signed-number name signed-literal

带符号数字

Pragma 可以接受零个或一个参数。参数可以放在括号中,也可以用等号与 pragma 名称分隔。这两种语法产生相同的结果。在许多 pragma 中,参数是布尔值。布尔值可以是以下之一

1 yes true on
0 no false off

关键字参数可以可选地出现在引号中。(例如'yes' [FALSE]。)一些 pragma 将字符串文字作为其参数。当 pragma 接受关键字参数时,通常也会接受数值等效项。例如,“0”和“no”含义相同,就像“1”和“yes”一样。查询设置值时,许多 pragma 返回数字而不是关键字。

Pragma 可以有可选的 模式名称 在 pragma 名称之前。模式名称 是已 附加 数据库的名称,或者对于主数据库和 TEMP 数据库分别为“main”或“temp”。如果省略可选的模式名称,则假定为“main”。在某些 pragma 中,模式名称毫无意义,会被简单地忽略。在下面的文档中,模式名称有意义的 pragma 显示为带有“schema.”前缀。


PRAGMA 函数

可以从普通的 SELECT 语句中访问返回结果且没有副作用的 PRAGMA,作为 表值函数。对于每个参与的 PRAGMA,相应的表值函数的名称与 PRAGMA 相同,但前面带有 7 个字符的“pragma_”前缀。PRAGMA 参数和模式(如果有)作为参数传递给表值函数,模式作为可选的最后一个参数。

例如,有关索引中列的信息可以使用 index_info pragma 如下所示

PRAGMA index_info('idx52');

或者,可以使用以下方法读取相同的内容:

SELECT * FROM pragma_index_info('idx52');

表值函数格式的优点是查询可以仅返回 PRAGMA 列的子集,可以包含 WHERE 子句,可以使用聚合函数,并且表值函数可以是联接中多个数据源之一。例如,要获取模式中所有已索引列的列表,可以查询

SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns'
  FROM sqlite_schema AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table'
 ORDER BY 1;

其他说明


Pragma 列表

注释

  1. 名称被删除线划掉的 Pragma 已弃用。请勿使用它们。它们是为了向后兼容性而存在。
  2. 这些 pragma 仅在使用非标准编译时选项的版本中可用。
  3. 这些 pragma 用于测试 SQLite,不建议在应用程序程序中使用。

PRAGMA analysis_limit

PRAGMA analysis_limit;
PRAGMA analysis_limit =
N;

查询或更改 近似 ANALYZE 设置的限制。这是 ANALYZE 命令在每个索引中检查的大致行数。如果省略参数 N,则分析限制保持不变。如果限制为零,则禁用分析限制,并且 ANALYZE 命令将检查每个索引的所有行。如果 N 大于零,则分析限制设置为 N,并且后续的 ANALYZE 命令将在检查大约 N 行后停止分析每个索引。如果 N 是负数或非整数值,则 pragma 的行为就像省略了 N 参数一样。在所有情况下,返回的值都是用于后续 ANALYZE 命令的新分析限制。

此 pragma 可用于帮助 ANALYZE 命令在大型数据库上更快地运行。仅检查每个索引的一部分时,分析结果不如完整检查时好,但结果通常足够好。将 N 设置为 100 或 1000 允许 ANALYZE 命令快速运行,即使在巨大的数据库文件上也是如此。

此 pragma 添加于 SQLite 3.32.0 版(2020-05-22)。当前实现仅使用 N 值的低 31 位 - 高阶位会被静默忽略。SQLite 的未来版本可能会开始使用高阶位。

从 SQLite 3.46.0 版(2024-05-23)开始,运行 ANALYZE 的推荐方法是使用 PRAGMA optimize 命令。PRAGMA optimize 将自动设置合理的临时分析限制,以确保 PRAGMA optimize 命令即使在巨大的数据库上也能快速完成。使用 PRAGMA optimize 而不是直接运行 ANALYZE 的应用程序不需要设置分析限制。 PRAGMA application_id


PRAGMA schema.application_id;
PRAGMA
schema.application_id = 整数 ;

application_id PRAGMA 用于查询或设置位于 数据库头 偏移量 68 处的 32 位有符号大端“应用程序 ID”整数。将 SQLite 用作其 应用程序文件格式 的应用程序应将应用程序 ID 整数设置为唯一的整数,以便诸如 file(1) 之类的实用程序可以确定特定的文件类型,而不仅仅是报告“SQLite3 数据库”。可以通过查阅 SQLite 源代码存储库中的 magic.txt 文件查看已分配的应用程序 ID 列表。

另请参见 user_version pragmaPRAGMA auto_vacuum


PRAGMA schema.auto_vacuum;
PRAGMA
schema.auto_vacuum = 0 | NONE | 1 | FULL | 2 | INCREMENTAL;

查询或设置数据库中的自动真空状态。

自动真空的默认设置为 0 或“none”,除非使用了 SQLITE_DEFAULT_AUTOVACUUM 编译时选项。“none”设置表示禁用自动真空。当禁用自动真空并从数据库中删除数据时,数据库文件的大小保持不变。未使用的数据库文件页面将添加到“空闲列表”中并在后续插入时重复使用。因此,不会丢失数据库文件空间。但是,数据库文件不会缩小。在此模式下,可以使用 VACUUM 命令重建整个数据库文件,从而回收未使用的磁盘空间。

当自动真空模式为 1 或“full”时,空闲列表页面将移动到数据库文件的末尾,并且数据库文件会在每次事务提交时被截断以删除空闲列表页面。但是请注意,自动真空仅从文件中截断空闲列表页面。自动真空不会像 VACUUM 命令那样对数据库进行碎片整理或重新打包各个数据库页面。实际上,由于它在文件中移动页面,因此自动真空实际上会使碎片问题更严重。

仅当数据库存储允许每个数据库页面向后追溯到其引用者的其他信息时,自动真空才可能。因此,必须在创建任何表之前打开自动真空。在创建表后无法启用或禁用自动真空。

当 auto_vacuum 的值为 2 或“incremental”时,将存储执行自动真空所需的其他信息,但不会像 auto_vacuum=full 那样在每次提交时自动执行自动真空。在增量模式下,必须调用单独的 incremental_vacuum pragma 才能执行自动真空。

数据库连接可以在任何时间在完全和增量自动vacuum模式之间切换。但是,从“none”切换到“full”或“incremental”只能在数据库是新的(还没有创建任何表)时或通过运行VACUUM命令时进行。要更改自动vacuum模式,首先使用auto_vacuum pragma设置新的所需模式,然后调用VACUUM命令重新组织整个数据库文件。要从“full”或“incremental”切换回“none”,即使在空数据库上也始终需要运行VACUUM

当auto_vacuum pragma被调用且没有参数时,它会返回当前的auto_vacuum模式。

PRAGMA automatic_index

PRAGMA automatic_index;
PRAGMA automatic_index =
布尔值;

查询、设置或清除自动索引功能。

自动索引3.7.17版本(2013-05-20)开始默认启用,但这在SQLite的未来版本中可能会发生变化。 PRAGMA busy_timeout


PRAGMA busy_timeout;
PRAGMA busy_timeout =
毫秒;

查询或更改繁忙超时设置。此pragma是sqlite3_busy_timeout() C语言接口的替代方案,它作为pragma提供,用于不提供直接访问sqlite3_busy_timeout()的语言绑定。

每个数据库连接只能有一个繁忙处理程序。此PRAGMA设置进程的繁忙处理程序,可能会覆盖任何先前设置的繁忙处理程序。 PRAGMA cache_size


PRAGMA 模式名.cache_size;
PRAGMA
模式名.cache_size = 页数;
PRAGMA
模式名.cache_size = -KiB;

查询或更改SQLite建议每个打开的数据库文件一次最多在内存中保存的数据库磁盘页数。是否遵守此建议由应用程序定义的页面缓存决定。内置于SQLite的默认页面缓存会遵守请求,但是替代的应用程序定义的页面缓存实现可以选择以不同的方式解释建议的缓存大小或完全忽略它。默认建议的缓存大小为-2000,这意味着缓存大小限制为2048000字节的内存。默认建议的缓存大小可以使用SQLITE_DEFAULT_CACHE_SIZE编译时选项进行更改。TEMP数据库的默认建议缓存大小为0页。

如果参数N为正,则建议的缓存大小设置为N。如果参数N为负,则缓存页数将调整为基于当前页大小使用大约abs(N*1024)字节内存的页数。SQLite会记住页面缓存中的页数,而不是使用的内存量。因此,如果使用负数设置缓存大小,随后更改页大小(使用PRAGMA page_size命令),则最大缓存内存量将按页大小变化的比例增加或减少。

向后兼容性说明:3.7.10版本(2012-01-16)之前,带负数N的cache_size的行为有所不同。在早期版本中,缓存中的页数设置为N的绝对值。

使用cache_size pragma更改缓存大小时,更改仅在当前会话中有效。关闭并重新打开数据库时,缓存大小将恢复为默认值。

默认页面缓存实现不会一次性分配全部缓存内存。缓存内存会根据需要以较小的块进行分配。page_cache设置是缓存可以使用内存量的(建议)上限,而不是它一直使用的内存量。这是默认页面缓存实现的行为,但应用程序定义的页面缓存如果需要,可以自由地表现出不同的行为。 PRAGMA cache_spill


PRAGMA cache_spill;
PRAGMA cache_spill=
布尔值;
PRAGMA
模式名.cache_spill=N;

cache_spill pragma启用或禁用pager在事务中间将脏缓存页溢出到数据库文件的能力。Cache_spill默认启用,大多数应用程序应该保持这种状态,因为缓存溢出通常是有利的。但是,缓存溢出会产生在数据库文件上获取独占锁的副作用。因此,一些具有大型长时间运行事务的应用程序可能希望禁用缓存溢出,以防止应用程序在事务COMMIT的那一刻之前获取数据库的独占锁。

此pragma的“PRAGMA cache_spill=N”形式设置溢出发生的最小缓存大小阈值。缓存中的页数必须超过cache_spill阈值和PRAGMA cache_size语句设置的最大缓存大小,才能发生溢出。

此pragma的“PRAGMA cache_spill=布尔值”形式适用于附加到数据库连接的所有数据库。但是,此语句的“PRAGMA cache_spill=N”形式仅适用于“main”模式或作为语句一部分指定的任何其他模式。 PRAGMA case_sensitive_like


PRAGMA case_sensitive_like = 布尔值;

LIKE运算符的默认行为是忽略ASCII字符的大小写。因此,默认情况下'a' LIKE 'A'为真。case_sensitive_like pragma安装一个新的应用程序定义的LIKE函数,该函数根据case_sensitive_like pragma的值区分大小写或不区分大小写。当case_sensitive_like禁用时,将表达默认的LIKE行为。当case_sensitive_like启用时,大小写变得重要。例如,'a' LIKE 'A'为假,但'a' LIKE 'a'仍然为真。

此pragma使用sqlite3_create_function()重载LIKE和GLOB函数,这可能会覆盖应用程序注册的LIKE和GLOB的先前实现。此pragma仅更改SQLLIKE运算符的行为。它不会更改sqlite3_strlike() C语言接口的行为,该接口始终不区分大小写。

警告:如果数据库在模式中的任何地方使用LIKE运算符,例如在CHECK约束中、在表达式索引中或在部分索引的WHERE子句中,则使用此PRAGMA更改LIKE运算符的定义会导致数据库看起来已损坏。PRAGMA integrity_check将报告错误。数据库实际上并没有损坏,因为将LIKE的行为更改回定义模式和填充数据库时的状态将解决问题。如果LIKE的使用仅发生在索引中,则可以通过运行REINDEX来解决问题。但是,不建议使用case_sensitive_like pragma。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA cell_size_check

PRAGMA cell_size_check
PRAGMA cell_size_check =
布尔值;

cell_size_check pragma启用或禁用在数据库b树页从磁盘初始读取时进行的其他完整性检查。启用单元格大小检查后,数据库损坏会更早地检测到,并且不太可能“蔓延”。但是,进行额外检查会带来少量性能损失,因此默认情况下单元格大小检查处于关闭状态。 PRAGMA checkpoint_fullfsync


PRAGMA checkpoint_fullfsync
PRAGMA checkpoint_fullfsync =
布尔值;

查询或更改检查点操作的fullfsync标志。如果设置了此标志,则在支持F_FULLFSYNC的系统上,在检查点操作期间使用F_FULLFSYNC同步方法。checkpoint_fullfsync标志的默认值为关闭。只有Mac OS-X支持F_FULLFSYNC。

如果设置了fullfsync标志,则对所有同步操作使用F_FULLFSYNC同步方法,并且checkpoint_fullfsync设置无关紧要。

PRAGMA collation_list

PRAGMA collation_list;

返回为当前数据库连接定义的排序规则列表。

PRAGMA compile_options

PRAGMA compile_options;

此pragma返回构建SQLite时使用的编译时选项名称,每行一个选项。返回的选项名称中省略了“SQLITE_”前缀。另请参阅sqlite3_compileoption_get() C/C++接口和sqlite_compileoption_get() SQL函数。

PRAGMA count_changes

PRAGMA count_changes;
PRAGMA count_changes =
布尔值;

查询或更改更改计数标志。通常,当未设置更改计数标志时,INSERTUPDATEDELETE语句不返回任何数据。当设置了count_changes时,每个命令都返回一行数据,其中包含一个整数值——命令插入、修改或删除的行数。返回的更改计数不包括触发器执行的任何插入、修改或删除、由外键操作自动进行的任何更改或由upsert引起的更新。

获取行更改计数的另一种方法是使用sqlite3_changes()sqlite3_total_changes()接口。不过,存在细微的差别。当使用INSTEAD OF触发器对视图运行INSERT、UPDATE或DELETE时,count_changes pragma报告触发视图中的行数,而sqlite3_changes()sqlite3_total_changes()则不报告。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA data_store_directory

PRAGMA data_store_directory;
PRAGMA data_store_directory = '
目录名称';

查询或更改sqlite3_data_directory全局变量的值,Windows操作系统接口后端使用该变量来确定使用相对路径名指定的数据库文件存储位置。

更改data_store_directory设置不是线程安全的。如果应用程序中的另一个线程同时运行任何SQLite接口,则永远不要更改data_store_directory设置。这样做会导致未定义的行为。更改data_store_directory设置会写入sqlite3_data_directory全局变量,并且该全局变量不受互斥锁保护。

此功能是为WinRT提供的,它没有用于读取或更改当前工作目录的操作系统机制。不建议在任何其他上下文中使用此pragma,并且在将来的版本中可能会被禁止。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA data_version

PRAGMA 模式名.data_version;

"PRAGMA data_version"命令提供了一个指示,表明数据库文件已被修改。将数据库内容保存在内存中或在屏幕上显示数据库内容的交互式程序可以使用PRAGMA data_version命令来确定它们是否需要刷新并重新加载其内存或更新屏幕显示。

如果在此期间任何其他连接对数据库进行了提交更改,则从同一连接两次调用“PRAGMA data_version”返回的整数值将不同。“PRAGMA data_version”值对于在同一数据库连接上进行的提交保持不变。“PRAGMA data_version”的行为对于所有数据库连接都是相同的,包括不同进程中的数据库连接和共享缓存数据库连接。

“PRAGMA data_version”值是每个数据库连接的本地属性,因此即使底层数据库相同,在单独的数据库连接上并发调用“PRAGMA data_version”两次返回的值通常也不同。只有在两个不同的时间点比较同一数据库连接返回的“PRAGMA data_version”值才有意义。PRAGMA database_list


PRAGMA database_list;

此pragma类似于查询,用于为附加到当前数据库连接的每个数据库返回一行。第二列是主数据库文件的“main”,用于存储TEMP对象的数据库文件的“temp”,或其他数据库文件的附加数据库的名称。第三列是数据库文件本身的名称,如果数据库未与文件关联,则为空字符串。

PRAGMA default_cache_size
PRAGMA schema.default_cache_size;
PRAGMA
schema.default_cache_size = 页数;

此pragma查询或设置每个打开的数据库文件将分配的磁盘缓存建议最大页数。此pragma与cache_size的区别在于,此处设置的值在数据库连接之间持久存在。默认缓存大小的值存储在数据库文件标头偏移量48处的4字节大端整数中。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA defer_foreign_keys

PRAGMA defer_foreign_keys
PRAGMA defer_foreign_keys =
布尔值;

当defer_foreign_keys PRAGMA处于打开状态时,所有外键约束的执行将延迟到最外层事务提交为止。defer_foreign_keys pragma默认为OFF,以便仅在外键约束创建为“DEFERRABLE INITIALLY DEFERRED”时才延迟外键约束。defer_foreign_keys pragma在每个COMMIT或ROLLBACK时自动关闭。因此,必须为每个事务分别启用defer_foreign_keys pragma。当然,只有在外键约束启用的情况下,此pragma才有意义。

在事务期间,可以使用sqlite3_db_status(db,SQLITE_DBSTATUS_DEFERRED_FKS,...) C语言接口来确定是否存在延迟且未解决的外键约束。

PRAGMA empty_result_callbacks

PRAGMA empty_result_callbacks;
PRAGMA empty_result_callbacks =
布尔值;

查询或更改empty-result-callbacks标志。

empty-result-callbacks标志仅影响sqlite3_exec() API。通常,当empty-result-callbacks标志被清除时,不会为返回零行数据的命令调用提供给sqlite3_exec()的回调函数。当在这种情况下设置empty-result-callbacks时,回调函数将被精确调用一次,第三个参数设置为0(NULL)。这是为了使使用sqlite3_exec() API的程序即使在查询不返回数据时也能检索列名。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA encoding

PRAGMA encoding;
PRAGMA encoding = 'UTF-8';
PRAGMA encoding = 'UTF-16';
PRAGMA encoding = 'UTF-16le';
PRAGMA encoding = 'UTF-16be';

在第一种形式中,如果主数据库已创建,则此pragma返回主数据库使用的文本编码,其中之一为“UTF-8”、“UTF-16le”(小端UTF-16编码)或“UTF-16be”(大端UTF-16编码)。如果主数据库尚未创建,则返回的值是将用于创建主数据库的文本编码(如果由此会话创建)。

此pragma的第二到第五种形式设置如果由此会话创建,则主数据库将使用哪种编码创建。字符串“UTF-16”解释为“使用本地机器字节顺序的UTF-16编码”。创建数据库后无法更改文本编码,任何尝试更改文本编码的操作都将被静默忽略。

如果未首先使用此pragma设置编码,则创建主数据库将使用的编码默认为由用于打开连接的API确定的编码。

为数据库设置编码后,将无法更改。

ATTACH命令创建的数据库始终使用与主数据库相同的编码。尝试ATTACH文本编码与“main”数据库不同的数据库将失败。

PRAGMA foreign_key_check

PRAGMA schema.foreign_key_check;
PRAGMA
schema.foreign_key_check(表名);

foreign_key_check pragma检查数据库或名为“表名”的表是否存在违反外键约束的情况。foreign_key_check pragma为每个外键违规返回一行输出。每行结果包含四列。第一列是包含REFERENCES子句的表的名称。第二列是包含无效REFERENCES子句的行rowid,如果子表是WITHOUT ROWID表,则为NULL。第三列是被引用的表的名称。第四列是失败的特定外键约束的索引。foreign_key_check pragma输出中的第四列与foreign_key_list pragma输出中的第一列相同。当指定“表名”时,仅检查由表名的CREATE TABLE语句中的REFERENCES子句创建的外键约束。

PRAGMA foreign_key_list

PRAGMA foreign_key_list(表名);

此pragma为表“表名”的CREATE TABLE语句中的REFERENCES子句创建的每个外键约束返回一行。PRAGMA foreign_keys


PRAGMA foreign_keys;
PRAGMA foreign_keys =
布尔值;

查询、设置或清除外键约束的执行。

此pragma在事务中是无操作的;只有在没有挂起的BEGINSAVEPOINT时,才能启用或禁用外键约束执行。

更改foreign_keys设置会影响使用数据库连接准备的所有语句的执行,包括在更改设置之前准备的语句。在更改foreign_keys设置后,使用旧版sqlite3_prepare()接口准备的任何现有语句都可能出现SQLITE_SCHEMA错误。

从SQLite 3.6.19版开始,外键执行的默认设置为OFF。但是,这可能会在SQLite的未来版本中发生更改。外键执行的默认设置可以在编译时使用SQLITE_DEFAULT_FOREIGN_KEYS预处理器宏指定。为了最大程度地减少未来的问题,应用程序应根据应用程序的要求设置外键执行标志,而不依赖于默认设置。PRAGMA freelist_count


PRAGMA schema.freelist_count;

返回数据库文件中未使用的页数。

PRAGMA full_column_names

PRAGMA full_column_names;
PRAGMA full_column_names =
布尔值;

查询或更改full_column_names标志。此标志与short_column_names标志一起确定SQLite为SELECT语句的结果列分配名称的方式。结果列的命名是按以下规则顺序应用的

  1. 如果结果存在AS子句,则列的名称为AS子句的右侧。

  2. 如果结果是通用表达式,而不是源表列的名称,则结果的名称是表达式文本的副本。

  3. 如果short_column_names pragma为ON,则结果的名称是源表列的名称,不带源表名称前缀:COLUMN。

  4. 如果short_column_namesfull_column_names两个pragma都为OFF,则应用情况(2)。

  5. 结果列的名称是源表和源列名称的组合:TABLE.COLUMN

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA fullfsync

PRAGMA fullfsync
PRAGMA fullfsync =
布尔值;

查询或更改fullfsync标志。此标志确定是否在支持它的系统上使用F_FULLFSYNC同步方法。fullfsync标志的默认值为关闭。只有Mac OS X支持F_FULLFSYNC。

另请参阅checkpoint_fullfsync

PRAGMA function_list

PRAGMA function_list;

此pragma返回数据库连接已知的SQL函数列表。结果的每一行描述单个SQL函数的单个调用签名。如果某些SQL函数可以(例如)使用可变数量的参数调用或可以接受各种编码的文本,则结果集中将有多行描述这些函数。PRAGMA hard_heap_limit


PRAGMA hard_heap_limit
PRAGMA hard_heap_limit=
N

如果指定了N并且N是小于当前硬堆限制的正整数,则此pragma将使用参数N调用sqlite3_hard_heap_limit64()接口。hard_heap_limit pragma始终返回与sqlite3_hard_heap_limit64(-1) C语言函数返回的整数相同。也就是说,它始终返回在应用此PRAGMA强加的任何更改后设置的硬堆限制的值。

此pragma只能降低堆限制,而不能提高堆限制。必须使用C语言接口sqlite3_hard_heap_limit64()来提高堆限制。

另请参阅soft_heap_limit pragmaPRAGMA ignore_check_constraints


PRAGMA ignore_check_constraints = 布尔值;

此pragma启用或禁用CHECK约束的执行。默认设置为关闭,这意味着默认情况下会执行CHECK约束。

PRAGMA incremental_vacuum

PRAGMA schema.incremental_vacuum(N);
PRAGMA
schema.incremental_vacuum;

incremental_vacuum pragma导致最多N页从freelist中删除。数据库文件将被截断相同数量。如果数据库未处于auto_vacuum=incremental模式或freelist上没有页面,则incremental_vacuum pragma无效。如果freelist上的页面少于N个,或者如果N小于1,或者如果省略了“(N)”参数,则清除整个freelist。

PRAGMA index_info

PRAGMA schema.index_info(索引名);

此pragma为命名索引中的每个键列返回一行。键列是实际上在创建索引的CREATE INDEX索引语句或UNIQUE约束PRIMARY KEY约束中命名的列。索引条目通常还包含指向被索引的表行的辅助列。index_info pragma不会显示辅助索引列,但index_xinfo pragma会列出它们。

index_info pragma的输出列如下

  1. 列在索引中的排名。(0表示最左边。)
  2. 正在索引的表中该列的排名。值为 -1 表示 rowid,值为 -2 表示正在使用 表达式
  3. 正在索引的列的名称。如果该列是 rowid表达式,则此列为 NULL。

如果不存在名为 index-name 的索引,但存在具有该名称的 WITHOUT ROWID 表,则(从 2019 年 10 月 4 日的 SQLite 3.30.0 版本 开始),此 pragma 返回 WITHOUT ROWID 表的主键列,因为它们在底层 B 树的记录中使用,也就是说,去除了重复的列。 PRAGMA index_list


PRAGMA schema.index_list(table-name);

此 pragma 为给定表关联的每个索引返回一行。

index_list pragma 的输出列如下

  1. 为每个索引分配的序列号,用于内部跟踪目的。
  2. 索引的名称。
  3. 如果索引是 UNIQUE,则为“1”,否则为“0”。
  4. 如果索引是由 CREATE INDEX 语句创建的,则为“c”,如果索引是由 UNIQUE 约束 创建的,则为“u”,如果索引是由 PRIMARY KEY 约束 创建的,则为“pk”。
  5. 如果索引是 部分索引,则为“1”,否则为“0”。

PRAGMA index_xinfo

PRAGMA schema.index_xinfo(index-name);

此 pragma 返回有关索引中每一列的信息。与 index_info pragma 不同,此 pragma 返回有关索引中每一列的信息,而不仅仅是键列。(键列是在创建索引的 CREATE INDEX 索引语句或 UNIQUE 约束PRIMARY KEY 约束 中实际命名的列。辅助列是找到对应于每个索引条目的表条目的其他所需列。)

index_xinfo pragma 的输出列如下

  1. 索引中该列的排名。(0 表示最左边。键列位于辅助列之前。)
  2. 正在索引的表中该列的排名,如果索引列是正在索引的表的 rowid,则为 -1,如果 索引基于表达式,则为 -2。
  3. 正在索引的列的名称,如果索引列是正在索引的表的 rowid表达式,则为 NULL。
  4. 如果索引列按索引以相反顺序(DESC)排序,则为 1,否则为 0。
  5. 用于比较索引列中值的 排序规则 的名称。
  6. 如果索引列是键列,则为 1,如果索引列是辅助列,则为 0。

如果不存在名为 index-name 的索引,但存在具有该名称的 WITHOUT ROWID 表,则(从 2019 年 10 月 4 日的 SQLite 3.30.0 版本 开始),此 pragma 返回 WITHOUT ROWID 表的列,因为它们在底层 B 树的记录中使用,也就是说,首先去除了重复的主键列,然后是数据列。 PRAGMA integrity_check


PRAGMA schema.integrity_check;
PRAGMA
schema.integrity_check(N)
PRAGMA
schema.integrity_check(TABLENAME)

此 pragma 对数据库进行低级格式和一致性检查。integrity_check pragma 会查找

如果 integrity_check pragma 发现问题,则会返回字符串(作为每行包含一列的多行),描述这些问题。Pragma integrity_check 在分析退出之前最多会返回 N 个错误,其中 N 默认为 100。如果 pragma integrity_check 未发现任何错误,则会返回包含值“ok”的单行。

通常情况下,会检查整个数据库文件。但是,如果参数是 TABLENAME,则仅对指定的表及其关联的索引执行检查。这称为“部分完整性检查”。由于仅检查数据库的一个子集,因此无法检测到诸如文件未使用的部分或两个或多个表重复使用文件同一部分等错误。仅当 TABLENAMEsqlite_schema 或其别名之一时,才会在部分完整性检查中验证空闲列表。3.33.0 版(2020 年 8 月 14 日)添加了对部分完整性检查的支持。

PRAGMA integrity_check 不会查找 FOREIGN KEY 错误。使用 PRAGMA foreign_key_check 命令查找 FOREIGN KEY 约束中的错误。

另请参阅 PRAGMA quick_check 命令,该命令执行 PRAGMA integrity_check 的大部分检查,但运行速度更快。

PRAGMA journal_mode

PRAGMA schema.journal_mode;
PRAGMA
schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF

此 pragma 查询或设置与当前 数据库连接 关联的数据库的日志模式。

此 pragma 的第一种形式查询 database 的当前日志模式。当省略 database 时,将查询“main”数据库。

第二种形式更改“database”的日志模式,如果省略“database”,则更改所有附加数据库的日志模式。将返回新的日志模式。如果无法更改日志模式,则将返回原始日志模式。

DELETE 日志模式是正常行为。在 DELETE 模式下,在每个事务结束时都会删除回滚日志。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为 SQLite 中的原子提交 的文档。)

TRUNCATE 日志模式通过将回滚日志截断为零长度而不是删除它来提交事务。在许多系统上,截断文件比删除文件快得多,因为不需要更改包含目录。

PERSIST 日志模式阻止在每个事务结束时删除回滚日志。相反,日志的标头将被零覆盖。这将防止其他数据库连接回滚日志。PERSIST 日志模式可用作平台上的优化,在这些平台上,删除或截断文件比用零覆盖文件的第一个块要昂贵得多。另请参阅:PRAGMA journal_size_limitSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT

MEMORY 日志模式将回滚日志存储在易失性 RAM 中。这可以节省磁盘 I/O,但以数据库的安全性和完整性为代价。如果使用 SQLite 的应用程序在设置 MEMORY 日志模式时在事务中间崩溃,则数据库文件很可能会 损坏

WAL 日志模式使用 预写日志 而不是回滚日志来实现事务。WAL 日志模式是持久的;设置后,它将在多个数据库连接以及关闭和重新打开数据库后仍然有效。处于 WAL 日志模式的数据库只能由 SQLite 3.7.0 版(2010 年 7 月 21 日)或更高版本访问。

OFF 日志模式完全禁用回滚日志。永远不会创建回滚日志,因此也永远不会删除回滚日志。OFF 日志模式禁用 SQLite 的原子提交和回滚功能。 ROLLBACK 命令不再起作用;它的行为是不确定的。当日志模式为 OFF 时,应用程序必须避免使用 ROLLBACK 命令。如果应用程序在设置 OFF 日志模式时在事务中间崩溃,则数据库文件很可能会 损坏。如果没有日志,则语句无法在约束错误后撤消部分完成的操作。这也可能导致数据库处于损坏状态。例如,如果重复条目导致 CREATE UNIQUE INDEX 语句在中途失败,它将留下一个部分创建的,因此是损坏的索引。由于 OFF 日志模式允许使用普通 SQL 损坏数据库文件,因此在启用 SQLITE_DBCONFIG_DEFENSIVE 时,它将被禁用。

请注意,内存数据库 的 journal_mode 为 MEMORY 或 OFF,并且无法更改为其他值。尝试将 内存数据库 的 journal_mode 更改为 MEMORY 或 OFF 以外的任何设置都会被忽略。另请注意,在事务处于活动状态时无法更改 journal_mode。

PRAGMA journal_size_limit

PRAGMA schema.journal_size_limit
PRAGMA
schema.journal_size_limit = N ;

如果数据库连接在 独占锁定模式持久日志模式(PRAGMA journal_mode=persist)下运行,则在提交事务后,回滚日志 文件可能会保留在文件系统中。这会提高后续事务的性能,因为覆盖现有文件比追加到文件更快,但也会消耗文件系统空间。在大型事务(例如 VACUUM)之后,回滚日志文件可能会占用大量空间。

类似地,在 WAL 模式 下,预写日志文件在 检查点 之后不会被截断。相反,SQLite 会重用现有文件以用于后续的 WAL 条目,因为覆盖比追加更快。

journal_size_limit pragma 可用于限制事务或检查点后留在文件系统中的回滚日志和 WAL 文件的大小。每次提交事务或重置 WAL 文件时,SQLite 都会将留在文件系统中的回滚日志文件或 WAL 文件的大小与此 pragma 设置的大小限制进行比较,如果日志或 WAL 文件更大,则将其截断为限制。

上面列出的 pragma 的第二种形式用于为指定的数据库设置新的限制(以字节为单位)。负数表示没有限制。要始终将回滚日志和 WAL 文件截断为其最小大小,请将 journal_size_limit 设置为零。上面列出的 pragma 的第一种和第二种形式都返回一个结果行,其中包含一个整数列 - 日志大小限制的值(以字节为单位)。默认日志大小限制为 -1(无限制)。SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT 预处理器宏可用于在编译时更改默认日志大小限制。

此 pragma 仅对 pragma 名称之前指定的单个数据库(如果未指定数据库,则对“main”数据库)进行操作。无法使用单个 PRAGMA 语句更改所有附加数据库的日志大小限制。必须为每个附加数据库单独设置大小限制。 PRAGMA legacy_alter_table


PRAGMA legacy_alter_table;
PRAGMA legacy_alter_table = boolean

此 pragma 设置或查询 legacy_alter_table 标志的值。当此标志开启时,ALTER TABLE RENAME 命令(用于更改表名)的工作方式与 SQLite 3.24.0(2018-06-04)及更早版本相同。更具体地说,当此标志开启时,ALTER TABLE RENAME 命令仅重写表名在其 CREATE TABLE 语句以及任何关联的 CREATE INDEXCREATE TRIGGER 语句中的初始出现。对表的其他引用保持不变,包括

此 pragma 的默认设置为 OFF,这意味着架构中任何地方对表的引用都将转换为新名称。

此 pragma 作为解决方法提供,用于解决旧程序中包含代码的问题,这些代码期望在旧版 SQLite 中找到的 ALTER TABLE RENAME 的不完整行为。新应用程序应保持此标志关闭。

为了与旧版 虚拟表 实现兼容,在运行 sqlite3_module.xRename 方法期间,此标志会暂时开启。在 sqlite3_module.xRename 方法完成之后,此标志的值将恢复。

还可以使用 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 选项到 sqlite3_db_config() 接口来切换 legacy alter table 行为的开启和关闭。

legacy alter table 行为是每个连接的设置。开启或关闭此功能会影响 数据库连接 中的所有附加数据库文件。此设置不会持久化。在一个连接中更改此设置不会影响任何其他连接。 PRAGMA legacy_file_format


PRAGMA legacy_file_format;

此 pragma 已经不再起作用。它已成为一个无操作指令。以前由 PRAGMA legacy_file_format 提供的功能现在可以使用 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 选项到 sqlite3_db_config() C 语言接口来获得。

PRAGMA locking_mode


PRAGMA schema.locking_mode;
PRAGMA
schema.locking_mode = NORMAL | EXCLUSIVE

此 pragma 设置或查询数据库连接的锁定模式。锁定模式为 NORMAL 或 EXCLUSIVE。

在 NORMAL 锁定模式下(除非在编译时使用 SQLITE_DEFAULT_LOCKING_MODE 覆盖,否则为默认模式),数据库连接会在每次读或写事务结束时解锁数据库文件。当锁定模式设置为 EXCLUSIVE 时,数据库连接永远不会释放文件锁。第一次在 EXCLUSIVE 模式下读取数据库时,将获得并保持一个共享锁。第一次写入数据库时,将获得并保持一个独占锁。

在 EXCLUSIVE 模式下由连接获得的数据库锁可以通过关闭数据库连接或使用此 pragma 将锁定模式设置回 NORMAL 并随后访问数据库文件(读或写)来释放。仅将锁定模式设置为 NORMAL 不够 - 必须在下次访问数据库文件时才会释放锁。

将锁定模式设置为 EXCLUSIVE 有三个原因。

  1. 应用程序想要阻止其他进程访问数据库文件。
  2. 减少文件系统操作的系统调用次数,从而可能导致性能略有提高。
  3. WAL 数据库可以在 EXCLUSIVE 模式下访问,而无需使用共享内存。(其他信息

当 locking_mode pragma 指定特定数据库时,例如

PRAGMA main.locking_mode=EXCLUSIVE;

则锁定模式仅适用于指定的数据库。如果“locking_mode”关键字前面没有数据库名称限定符,则锁定模式将应用于所有数据库,包括随后 ATTACH 命令添加的任何新数据库。

“temp”数据库(其中存储 TEMP 表和索引)和 内存数据库 始终使用独占锁定模式。无法更改 temp 和 内存数据库 的锁定模式。所有其他数据库默认使用正常锁定模式,并受此 pragma 的影响。

如果在第一次进入 WAL 日志模式 时锁定模式为 EXCLUSIVE,则在退出 WAL 日志模式之前无法将锁定模式更改为 NORMAL。如果在第一次进入 WAL 日志模式时锁定模式为 NORMAL,则可以在任何时间在 NORMAL 和 EXCLUSIVE 之间更改锁定模式,而无需退出 WAL 日志模式。

PRAGMA max_page_count

PRAGMA schema.max_page_count;
PRAGMA
schema.max_page_count = N;

查询或设置数据库文件中的最大页面数。pragma 的两种形式都返回最大页面数。第二种形式尝试修改最大页面数。最大页面数不能减少到低于当前数据库大小。

PRAGMA mmap_size


PRAGMA schema.mmap_size;
PRAGMA
schema.mmap_size=N

查询或更改为单个数据库分配的用于内存映射 I/O 的最大字节数。第一种形式(没有参数)查询当前限制。第二种形式(带数值参数)设置指定数据库的限制,或者如果省略可选数据库名称,则设置所有数据库的限制。在第二种形式中,如果省略数据库名称,则设置的限制将成为所有数据库的默认限制,这些数据库随后由 ATTACH 语句添加到 数据库连接 中。

参数 N 是将使用内存映射 I/O 访问的数据库文件中的最大字节数。如果 N 为零,则禁用内存映射 I/O。如果 N 为负,则限制将恢复到由最近的 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 确定的默认值,或者如果未设置启动时限制,则恢复到由 SQLITE_DEFAULT_MMAP_SIZE 确定的编译时默认值。

PRAGMA mmap_size 语句永远不会将用于内存映射 I/O 的地址空间大小增加到超过由 SQLITE_MAX_MMAP_SIZE 编译时选项设置的硬限制,也不会超过由 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 的第二个参数在启动时设置的硬限制。

在内存映射 I/O 区域处于活动使用状态时,无法更改内存映射 I/O 区域的大小,以避免在正在运行的 SQL 语句下取消映射内存。因此,如果先前的 mmap_size 非零且有其他 SQL 语句在同一 数据库连接 上并发运行,则 mmap_size pragma 可能不会执行任何操作。

PRAGMA module_list

PRAGMA module_list;

此 pragma 返回与数据库连接注册的 虚拟表 模块列表。 PRAGMA optimize


PRAGMA optimize;
PRAGMA optimize(
MASK);
PRAGMA
schema.optimize;
PRAGMA
schema.optimize(MASK);

尝试优化数据库。前两种形式优化所有模式,后两种形式仅优化指定的模式。

在大多数应用程序中,按如下方式使用 PRAGMA optimize 将有助于 SQLite 达到最佳查询性能

  1. 具有短暂数据库连接的应用程序应运行“PRAGMA optimize;”,仅在关闭每个数据库连接之前运行一次。

  2. 使用长期数据库连接的应用程序应在连接首次打开时运行“PRAGMA optimize=0x10002;”,然后定期运行“PRAGMA optimize;”,也许每天或每小时一次。

  3. 所有应用程序都应在架构更改后运行“PRAGMA optimize;”,尤其是在一个或多个 CREATE INDEX 语句之后。

此 pragma 通常是无操作指令或几乎是无操作指令,并且速度非常快。在需要对一个或多个表运行 ANALYZE 的情况下,它会设置一个临时 分析限制,该限制仅在 pragma 的持续时间内有效,以防止 ANALYZE 调用运行时间过长。

建议的做法是,具有短暂数据库连接的应用程序应在数据库连接关闭时运行一次“PRAGMA optimize”。具有长期数据库连接的应用程序应在数据库连接首次打开时运行“PRAGMA optimize=0x10002”,然后定期再次运行“PRAGMA optimize” - 也许每天一次。所有应用程序都应在架构更改后运行“PRAGMA optimize”,尤其是 CREATE INDEX

此 pragma 执行的优化的详细信息预计会随着时间的推移而发生变化和改进。应用程序应预料到此 pragma 将在将来的版本中执行新的优化。

可选的 MASK 参数是要执行的优化的位掩码

0x00001调试模式。不实际执行任何优化,而是为每个本来会执行的优化返回一行文本。默认情况下关闭。
0x00002对可能受益的表运行 ANALYZE。默认情况下开启。
0x00010在运行 ANALYZE 时,设置一个临时 PRAGMA analysis_limit 以防止运行时间过长。默认情况下开启。
0x10000检查所有表的的大小,而不仅仅是最近未使用过的表的大小,以查看是否有任何表的大小发生了显着增长或缩小,因此可能受益于重新分析。默认情况下关闭。

默认 MASK 为 0xfffe。

要查看本来会执行的所有优化,而不实际执行它们,请运行“PRAGMA optimize(-1)”。

何时运行 Analyze 的确定

在当前实现中,当且仅当满足以下所有条件时,才会分析表

  1. MASK 位 0x02 已设置。
  2. 该表是普通表,而不是视图或虚拟表。
  3. 表名不以“sqlite_”开头。
  4. 以下一项或多项为真
    1. MASK 的 0x10000 位已设置
    2. 表上的一个或多个索引在 sqlite_stat1 表中缺少条目。
    3. 查询规划器在当前数据库连接的生命周期中的某个时刻对该表的索引使用 sqlite_stat1 统计信息。
  5. 以下一项或多项为真
    1. 表上的一个或多个索引在 sqlite_stat1 表中缺少条目。
    2. 自上次对表运行 ANALYZE 以来,表中的行数增加了或减少了 10 倍。

表何时被分析的规则可能会在将来的版本中发生变化。将来可能会添加新的 MASK 值。此 pragma 的未来版本可能会接受字符串文字参数而不是位掩码,尽管为了向后兼容性,将继续支持位掩码参数。 PRAGMA page_count


PRAGMA schema.page_count;

返回数据库文件中的总页面数。

PRAGMA page_size

PRAGMA schema.page_size;
PRAGMA
schema.page_size = bytes;

查询或设置数据库的页面大小。页面大小必须是介于 512 和 65536(含)之间的 2 的幂。

创建新数据库时,SQLite 会根据平台和文件系统为数据库分配页面大小。多年来,默认页面大小几乎总是 1024 字节,但从 SQLite 版本 3.12.0(2016-03-29)开始,默认页面大小增加到 4096。建议大多数应用程序使用默认页面大小。

指定新的页面大小不会立即更改页面大小。相反,新的页面大小会被记住,并在首次创建数据库时用于设置页面大小,如果数据库在发出 page_size pragma 时尚不存在,或者在同一数据库连接上运行的下一个VACUUM命令(且不在WAL 模式下)时使用。

可以使用SQLITE_DEFAULT_PAGE_SIZE编译时选项更改分配给新数据库的默认页面大小。PRAGMA parser_trace


PRAGMA parser_trace = 布尔值;

如果 SQLite 已使用SQLITE_DEBUG编译时选项编译,则可以使用 parser_trace pragma 打开 SQLite 内部使用的 SQL 解析器的跟踪功能。此功能用于调试 SQLite 本身。

此 pragma 旨在用于调试 SQLite 本身。仅当使用SQLITE_DEBUG编译时选项时才可用。

PRAGMA pragma_list

PRAGMA pragma_list;

此 pragma 返回数据库连接已知的 PRAGMA 命令列表。PRAGMA query_only


PRAGMA query_only;
PRAGMA query_only =
布尔值;

启用 query_only pragma 后,将阻止对数据库文件进行数据更改。启用此 pragma 后,任何尝试创建、删除、丢弃、插入或更新的操作都将导致SQLITE_READONLY错误。但是,数据库并非真正只读。您仍然可以运行checkpointCOMMIT,并且sqlite3_db_readonly()例程的返回值不受影响。

PRAGMA quick_check

PRAGMA 模式.quick_check;
PRAGMA
模式.quick_check(N)
PRAGMA 模式.quick_check(表名)

此 pragma 与integrity_check类似,但它不验证唯一性约束,也不验证索引内容是否与表内容匹配。通过跳过唯一性和索引一致性检查,quick_check 可以更快地运行。PRAGMA quick_check 的时间复杂度为 O(N),而PRAGMA integrity_check的时间复杂度为 O(NlogN),其中 N 是数据库中行的总数。否则,这两个 pragma 是相同的。

PRAGMA read_uncommitted

PRAGMA read_uncommitted;
PRAGMA read_uncommitted =
布尔值;

查询、设置或清除 READ UNCOMMITTED 隔离级别。SQLite 的默认隔离级别为 SERIALIZABLE。任何进程或线程都可以选择 READ UNCOMMITTED 隔离级别,但除了共享公共页面和模式缓存的连接之间外,仍将使用 SERIALIZABLE。缓存共享是使用sqlite3_enable_shared_cache() API 启用的。默认情况下禁用缓存共享。

有关更多信息,请参阅SQLite 共享缓存模式

PRAGMA recursive_triggers

PRAGMA recursive_triggers;
PRAGMA recursive_triggers =
布尔值;

查询、设置或清除递归触发器功能。

更改 recursive_triggers 设置会影响使用数据库连接准备的所有语句的执行,包括在更改设置之前准备的语句。使用旧版sqlite3_prepare()接口准备的任何现有语句在更改 recursive_triggers 设置后都可能因SQLITE_SCHEMA错误而失败。

在 SQLite 3.6.18 版(2009-09-11)之前,不支持递归触发器。SQLite 的行为始终如同此 pragma 设置为 OFF 一样。在 3.6.18 版中添加了对递归触发器的支持,但最初默认情况下处于关闭状态,以确保兼容性。在 SQLite 的未来版本中,可能会默认启用递归触发器。

触发器的递归深度受SQLITE_MAX_TRIGGER_DEPTH编译时选项设置的硬性上限和sqlite3_limit(db,SQLITE_LIMIT_TRIGGER_DEPTH,...) 设置的运行时限制。

PRAGMA reverse_unordered_selects

PRAGMA reverse_unordered_selects;
PRAGMA reverse_unordered_selects =
布尔值;

启用此 PRAGMA 后,许多没有 ORDER BY 子句的SELECT语句将以与其通常相反的顺序输出其结果。这可以帮助调试对结果顺序做出无效假设的应用程序。reverse_unordered_selects pragma 适用于大多数 SELECT 语句,但是查询计划程序有时可能会选择不容易反转的算法,在这种情况下,无论 reverse_unordered_selects 设置如何,输出都将按相同的顺序显示。

如果 SELECT 省略了 ORDER BY 子句,则 SQLite 不会保证结果的顺序。即使如此,结果的顺序在每次运行之间也不会改变,因此许多应用程序错误地开始依赖于任意的输出顺序,无论该顺序是什么。但是,有时 SQLite 的新版本将包含优化器增强功能,这会导致没有 ORDER BY 子句的查询的输出顺序发生变化。发生这种情况时,依赖于特定输出顺序的应用程序可能会发生故障。通过使用此 pragma 禁用和启用该 pragma 多次运行应用程序,可以尽早识别并修复应用程序对输出顺序做出错误假设的情况,从而减少可能由链接到不同版本的 SQLite 引起的错误。

PRAGMA schema_version

PRAGMA 模式.schema_version;
PRAGMA
模式.schema_version = 整数 ;

schema_version pragma 将获取或设置数据库头中偏移量 40 处的模式版本整数的值。

每当模式发生变化时,SQLite 都会自动递增模式版本。在每个 SQL 语句运行时,都会检查模式版本以确保自准备 SQL 语句以来模式未发生更改。准备。通过使用“PRAGMA schema_version=N”更改 schema_version 的值来破坏此机制可能会导致 SQL 语句使用过时的模式运行,这可能导致错误的答案和/或数据库损坏。读取 schema_version 始终是安全的,但更改 schema_version 会导致问题。因此,当为数据库连接启用防御模式时,尝试更改 schema_version 的值将是静默的无操作。

警告:错误使用此 pragma 可能会导致数据库损坏

就本 pragma 而言,VACUUM命令被视为模式更改,因为VACUUM通常会更改sqlite_schema 表中条目的“rootpage”值。

另请参阅application_id pragmauser_version pragmaPRAGMA secure_delete


PRAGMA 模式.secure_delete;
PRAGMA
模式.secure_delete = 布尔值|FAST

查询或更改安全删除设置。当 secure_delete 启用时,SQLite 会用零覆盖已删除的内容。secure_delete 的默认设置由SQLITE_SECURE_DELETE编译时选项确定,通常为关闭。secure_delete 的关闭设置通过减少 CPU 周期和磁盘 I/O 量来提高性能。希望在内容被删除或更新后避免留下取证痕迹的应用程序应在执行删除或更新之前启用 secure_delete pragma,或者在删除或更新后运行VACUUM

secure_delete 的“fast”设置(大约在 2017-08-01 添加)是“on”和“off”之间的中间设置。当 secure_delete 设置为“fast”时,SQLite 仅在这样做不会增加 I/O 量的情况下用零覆盖已删除的内容。换句话说,“fast”设置使用更多的 CPU 周期,但不使用更多的 I/O。这将清除B 树页面上的所有旧内容,但会在空闲列表页面上留下取证痕迹。

当存在附加数据库并且在 pragma 中未指定数据库时,所有数据库的安全删除设置都会被更改。新附加数据库的安全删除设置是在评估 ATTACH 命令时主数据库的设置。

当多个数据库连接共享同一个缓存时,在一个数据库连接上更改 secure_delete 标志会将其更改为所有连接。

限制:secure_delete pragma 仅导致已删除的内容从普通表中清除。如果虚拟表将内容存储在影子表中,则从虚拟表中删除内容不一定能从影子表中删除取证痕迹。特别是,与 SQLite 捆绑在一起的FTS3FTS5虚拟表即使启用了 secure_delete pragma,也可能会在其影子表中留下取证痕迹。

PRAGMA short_column_names

PRAGMA short_column_names;
PRAGMA short_column_names =
布尔值;

查询或更改短列名标志。此标志会影响 SQLite 为SELECT语句返回的数据列命名的方式。有关完整详细信息,请参阅full_column_names pragma。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA shrink_memory

PRAGMA shrink_memory

此 pragma 会导致调用它的数据库连接通过调用sqlite3_db_release_memory()释放尽可能多的内存。

PRAGMA soft_heap_limit

PRAGMA soft_heap_limit
PRAGMA soft_heap_limit=
N

如果指定了 N 且 N 为非负整数,则此 pragma 会使用参数 N 调用sqlite3_soft_heap_limit64()接口。soft_heap_limit pragma 始终返回与sqlite3_soft_heap_limit64(-1) C 语言函数返回的整数相同的值。

另请参阅hard_heap_limit pragmaPRAGMA stats


PRAGMA stats;

此 pragma 返回有关表和索引的辅助信息。返回的信息在测试期间用于帮助验证查询计划程序是否正常运行。此 pragma 的格式和含义可能会在不同版本之间发生变化。由于其易变性,因此此 pragma 的行为和输出格式故意没有记录。

此 pragma 的预期用途仅用于测试和验证 SQLite。此 pragma 可能会在未经通知的情况下发生更改,不建议应用程序使用。

PRAGMA synchronous

PRAGMA 模式.synchronous;
PRAGMA
模式.synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA;

查询或更改“synchronous”标志的设置。第一个(查询)表单将以整数形式返回 synchronous 设置。第二个表单更改 synchronous 设置。各种 synchronous 设置的含义如下

EXTRA (3)
EXTRA synchronous 类似于 FULL,此外在 DELETE 模式下提交事务以取消链接回滚日志后,还会同步包含回滚日志的目录。如果提交紧随其后的是断电,则 EXTRA 提供额外的持久性。
FULL (2)
当 synchronous 为 FULL (2) 时,SQLite 数据库引擎将使用VFS的 xSync 方法确保所有内容在继续之前安全地写入磁盘表面。这确保了操作系统崩溃或断电不会损坏数据库。FULL synchronous 非常安全,但也更慢。在不使用WAL 模式时,FULL 是最常用的 synchronous 设置。
NORMAL

(1)
当 synchronous 为 NORMAL (1) 时,SQLite 数据库引擎仍然会在最关键的时刻进行同步,但频率低于 FULL 模式。在旧文件系统上,如果 `journal_mode` 为 DELETE,则在恰好错误的时间发生断电可能会损坏数据库(尽管概率很小但并非为零)。在 synchronous=NORMAL 时,WAL 模式 不会发生损坏,现代文件系统上的 DELETE 模式可能也安全。WAL 模式与 synchronous=NORMAL 一致,但 WAL 模式会损失持久性。在 WAL 模式下使用 synchronous=NORMAL 提交的事务可能会在断电或系统崩溃后回滚。无论 synchronous 设置或 journal 模式如何,事务在应用程序崩溃后都是持久的。对于大多数在 WAL 模式 下运行的应用程序来说,synchronous=NORMAL 设置是一个不错的选择。
OFF (0)
使用 synchronous OFF (0),SQLite 会在将数据传递给操作系统后立即继续,而不会进行同步。如果运行 SQLite 的应用程序崩溃,数据将是安全的,但如果操作系统崩溃或计算机在数据写入磁盘表面之前断电,则数据库 可能会损坏。另一方面,使用 synchronous OFF,提交速度可以提高数个数量级。

WAL 模式下,当 synchronous 为 NORMAL (1) 时,WAL 文件会在每次 检查点 之前同步,数据库文件会在每次完成的 检查点 之后同步,并且当 WAL 文件在检查点后开始重复使用时,WAL 文件头会同步,但在大多数事务期间不会发生同步操作。在 WAL 模式下,使用 synchronous=FULL,会在每次事务提交后额外同步一次 WAL 文件。每次事务提交后额外的 WAL 同步有助于确保事务在断电后持久。事务在 synchronous=FULL 提供的额外同步操作存在与否的情况下都是一致的。如果持久性不是问题,那么在 WAL 模式下,通常只需要 synchronous=NORMAL。

TEMP 模式始终使用 synchronous=OFF,因为 TEMP 的内容是短暂的,并且不希望在断电后仍然存在。尝试更改 TEMP 的 synchronous 设置会被静默忽略。

另请参阅 fullfsynccheckpoint_fullfsync 语法。

PRAGMA table_info

PRAGMA schema.table_info(table-name);

此语法为指定表中的每个普通列返回一行。结果集中的列包括:“name”(列名);“type”(如果给出则为数据类型,否则为空);“notnull”(列是否可以为 NULL);“dflt_value”(列的默认值);以及“pk”(对于不是主键一部分的列,值为零,或者主键内列的基于 1 的索引)。

“cid”列不应被理解为超过“当前结果集中的排名”。

table_info 语法中指定的表也可以是视图。

此语法不显示有关 生成列隐藏列 的信息。使用 PRAGMA table_xinfo 获取更完整的列列表,其中包括生成列和隐藏列。PRAGMA table_list


PRAGMA table_list;
PRAGMA
schema.table_list;
PRAGMA table_list(
table-name);

此语法返回有关模式中表和视图的信息,每行输出一个表。table_list 语法首次出现在 SQLite 3.37.0 版本(2021-11-27)。从最初发布开始,table_list 语法返回的列包括下面列出的列。SQLite 的未来版本可能会添加其他输出列。

  1. schema:表或视图所在的模式(例如“main”或“temp”)。
  2. name:表或视图的名称。
  3. type:对象的类型 - “table”、“view”、“shadow”(用于 影子表)或虚拟表的“virtual”。
  4. ncol:表中列的数量,包括 生成列隐藏列
  5. wr:如果表是 WITHOUT ROWID 表则为 1,否则为 0。
  6. strict:如果表是 STRICT 表 则为 1,否则为 0。
  7. 未来版本可能会添加其他列。

默认行为是在所有模式中显示所有表。如果 schema. 名称出现在语法之前,则仅显示该模式中的表。如果提供了 table-name 参数,则仅返回有关该表的的信息。PRAGMA table_xinfo


PRAGMA schema.table_xinfo(table-name);

此语法为指定表中的每一列返回一行,包括 生成列隐藏列。输出与 PRAGMA table_info 的输出具有相同的列,另外还有一列“hidden”,其值表示普通列 (0)、动态或存储的生成列 (2 或 3) 或虚拟表中的隐藏列 (1)。此字段为非零值的行是 PRAGMA table_info 中省略的行。PRAGMA temp_store


PRAGMA temp_store;
PRAGMA temp_store =
0 | DEFAULT | 1 | FILE | 2 | MEMORY;

查询或更改“temp_store”参数的设置。当 temp_store 为 DEFAULT (0) 时,编译时 C 预处理器宏 SQLITE_TEMP_STORE 用于确定临时表和索引的存储位置。当 temp_store 为 MEMORY (2) 时,临时表 和索引的存储方式就像它们在纯 内存数据库 中一样。当 temp_store 为 FILE (1) 时,临时表 和索引存储在文件中。如果指定了 FILE,则可以使用 temp_store_directory 语法指定包含临时文件的目录。当更改 temp_store 设置时,所有现有的临时表、索引、触发器和视图将立即删除。

库编译时 C 预处理器符号 SQLITE_TEMP_STORE 可以覆盖此语法设置。下表总结了 SQLITE_TEMP_STORE 预处理器宏和 temp_store 语法的交互

SQLITE_TEMP_STORE PRAGMA
temp_store
TEMP 表和索引使用的存储
TEMP 表和索引
0 任何 文件
1 0 文件
1 1 文件
1 2 内存
2 0 内存
2 1 文件
2 2 内存
3 任何 内存
PRAGMA temp_store_directory

PRAGMA temp_store_directory;
PRAGMA temp_store_directory = '
directory-name';

查询或更改 sqlite3_temp_directory 全局变量的值,许多操作系统接口后端使用它来确定 临时表 和索引的存储位置。

当更改 temp_store_directory 设置时,发出语法的数据库连接中的所有现有临时表、索引、触发器和查看器将立即删除。在实践中,应在打开进程的第一个数据库连接后立即设置 temp_store_directory。如果在同一进程中其他数据库连接打开时更改了一个数据库连接的 temp_store_directory,则行为未定义,可能不希望发生。

更改 temp_store_directory 设置不是线程安全的。如果应用程序中的另一个线程同时运行任何 SQLite 接口,则永远不要更改 temp_store_directory 设置。这样做会导致未定义的行为。更改 temp_store_directory 设置会写入 sqlite3_temp_directory 全局变量,并且该全局变量不受互斥锁保护。

directory-name 值应包含在单引号中。要将目录恢复为默认值,请将 directory-name 设置为空字符串,例如 PRAGMA temp_store_directory = ''。如果找不到 directory-name 或无法写入,则会引发错误。

临时文件的默认目录取决于操作系统。某些操作系统接口可能会选择忽略此变量,并将临时文件放在此处指定的目录之外的其他目录中。从这个意义上讲,此语法仅供参考。

此pragma已弃用,仅出于向后兼容性而存在。新的应用程序应避免使用此pragma。旧的应用程序应尽快停止使用此pragma。当SQLite使用SQLITE_OMIT_DEPRECATED编译时,此pragma可能会从构建中省略。

PRAGMA threads

PRAGMA threads;
PRAGMA threads =
N;

查询或更改当前数据库连接的 sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) 限制的值。此限制为辅助线程的数量设置上限,预备语句 允许启动这些辅助线程来协助查询。默认限制为 0,除非使用 SQLITE_DEFAULT_WORKER_THREADS 编译时选项更改。当限制为零时,表示不会启动辅助线程。

此语法是 sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) 接口的薄包装器。

PRAGMA trusted_schema

PRAGMA trusted_schema;
PRAGMA trusted_schema =
boolean;

trusted_schema 设置是一个每个连接的布尔值,它决定是否允许视图、触发器或模式(如 检查约束默认子句生成列表达式索引 和/或 部分索引)的表达式运行尚未经过安全审计的 SQL 函数和虚拟表。此设置也可以使用 sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,...) C 语言接口进行控制。

为了保持向后兼容性,此设置默认为 ON。将其关闭有一些优势,并且如果将其关闭,大多数应用程序都不会受到影响。因此,鼓励所有应用程序在打开每个数据库连接后立即关闭此设置。

-DSQLITE_TRUSTED_SCHEMA=0 编译时选项将导致此设置默认为 OFF。PRAGMA user_version


PRAGMA schema.user_version;
PRAGMA
schema.user_version = integer ;

user_version 语法将获取或设置 数据库头 中偏移量 60 处的用户版本整数的值。用户版本是一个整数,应用程序可以根据需要使用它。SQLite 本身不使用用户版本。

另请参阅 application_id 语法schema_version 语法PRAGMA vdbe_addoptrace


PRAGMA vdbe_addoptrace = boolean;

如果 SQLite 已使用 SQLITE_DEBUG 编译时选项编译,则可以使用 vdbe_addoptrace 语法在代码生成期间显示完整的 VDBE 操作码。此功能用于调试 SQLite 本身。有关更多信息,请参阅 VDBE 文档

此 pragma 旨在用于调试 SQLite 本身。仅当使用SQLITE_DEBUG编译时选项时才可用。

PRAGMA vdbe_debug

PRAGMA vdbe_debug = boolean;

如果 SQLite 已使用 SQLITE_DEBUG 编译时选项编译,则 vdbe_debug 语法是其他三个仅用于调试的语法的简写:vdbe_addoptrace、vdbe_listing 和 vdbe_trace。此功能用于调试 SQLite 本身。有关更多信息,请参阅 VDBE 文档

此 pragma 旨在用于调试 SQLite 本身。仅当使用SQLITE_DEBUG编译时选项时才可用。

PRAGMA vdbe_listing

PRAGMA vdbe_listing = boolean;

如果 SQLite 编译时启用了 SQLITE_DEBUG 编译选项,则可以使用 vdbe_listing pragma 在标准输出上显示虚拟机操作码的完整列表,每次语句执行时都会显示。启用列表时,程序的全部内容会在执行开始前打印出来。打印列表后,语句会正常执行。此功能用于调试 SQLite 本身。有关更多信息,请参阅 VDBE 文档

此 pragma 旨在用于调试 SQLite 本身。仅当使用SQLITE_DEBUG编译时选项时才可用。

PRAGMA vdbe_trace

PRAGMA vdbe_trace = 布尔值;

如果 SQLite 编译时启用了 SQLITE_DEBUG 编译选项,则可以使用 vdbe_trace pragma 在标准输出上显示虚拟机操作码,每次执行时都会显示。此功能用于调试 SQLite。有关更多信息,请参阅 VDBE 文档

此 pragma 旨在用于调试 SQLite 本身。仅当使用SQLITE_DEBUG编译时选项时才可用。

PRAGMA wal_autocheckpoint

PRAGMA wal_autocheckpoint;
PRAGMA wal_autocheckpoint=
N;

此 pragma 查询或设置 预写日志自动检查点 间隔。当启用 预写日志(通过 journal_mode pragma)时,只要预写日志的长度等于或超过 N 页,就会自动运行检查点。将自动检查点大小设置为零或负值会关闭自动检查点。

此 pragma 是 sqlite3_wal_autocheckpoint() C 接口的包装器。所有自动检查点都是 PASSIVE

默认情况下启用自动检查点,间隔为 1000 或 SQLITE_DEFAULT_WAL_AUTOCHECKPOINT

PRAGMA wal_checkpoint

PRAGMA 数据库名.wal_checkpoint;
PRAGMA 数据库名.wal_checkpoint(PASSIVE);
PRAGMA 数据库名.wal_checkpoint(FULL);
PRAGMA 数据库名.wal_checkpoint(RESTART);
PRAGMA 数据库名.wal_checkpoint(TRUNCATE);

如果启用了 预写日志(通过 journal_mode pragma),则此 pragma 会在数据库 数据库名 上运行 检查点 操作,如果省略 数据库名,则会在所有附加的数据库上运行。如果禁用了 预写日志 模式,则此 pragma 不会产生任何影响。

在不带参数的情况下调用此 pragma 等效于调用 sqlite3_wal_checkpoint() C 接口。

在带参数的情况下调用此 pragma 等效于调用 sqlite3_wal_checkpoint_v2() C 接口,其中 第 3 个参数 对应于该参数。
PASSIVE
在不等待任何数据库读取器或写入器完成的情况下,尽可能多地检查点帧。如果日志中的所有帧都已检查点,则同步数据库文件。此模式与调用 sqlite3_wal_checkpoint() C 接口相同。在此模式下,不会调用 繁忙处理程序回调
FULL
此模式会阻塞(调用 繁忙处理程序回调),直到没有数据库写入器并且所有读取器都从最新的数据库快照中读取数据。然后,它会检查点日志文件中的所有帧并同步数据库文件。FULL 在运行时会阻塞并发写入器,但读取器可以继续进行。
RESTART
此模式的工作方式与 FULL 相同,此外,在检查点日志文件后,它会阻塞(调用 繁忙处理程序回调),直到所有读取器都完成了对日志文件的读取。这确保了下一个写入数据库文件的客户端会从头开始重新启动日志文件。RESTART 在运行时会阻塞并发写入器,但允许读取器继续进行。
TRUNCATE
此模式的工作方式与 RESTART 相同,此外,在成功完成后,WAL 文件会被截断为零字节。

wal_checkpoint pragma 返回包含三列整数的一行数据。第一列通常为 0,但如果 RESTART 或 FULL 或 TRUNCATE 检查点被阻止完成,例如因为另一个线程或进程正在积极使用数据库,则为 1。换句话说,如果对 sqlite3_wal_checkpoint_v2() 的等效调用将返回 SQLITE_OK,则第一列为 0;如果等效调用将返回 SQLITE_BUSY,则为 1。第二列是已写入预写日志文件的已修改页数。第三列是检查点结束时已成功移回数据库文件的预写日志文件中的页数。如果不存在预写日志,例如在对未处于 WAL 模式 的数据库连接上调用此 pragma 时,则第二列和第三列为 -1。

PRAGMA writable_schema

PRAGMA writable_schema = 布尔值;
PRAGMA writable_schema = RESET

当此 pragma 启用且 SQLITE_DBCONFIG_DEFENSIVE 标志关闭时,可以使用普通的 UPDATEINSERTDELETE 语句更改 sqlite_schema 表。如果参数为“RESET”,则禁用模式写入(与“PRAGMA writable_schema=OFF”相同),此外,模式也会重新加载。警告:错误使用此 pragma 可能会导致 数据库文件损坏


此页面上次修改于 2024-04-16 16:29:07 UTC