PRAGMA 语句是 SQLite 特有的 SQL 扩展,用于修改 SQLite 库的操作或查询 SQLite 库的内部(非表)数据。PRAGMA 语句使用与其他 SQLite 命令(例如SELECT、INSERT)相同的接口发出,但在以下重要方面有所不同:
SQLite 的 C 语言 API 提供SQLITE_FCNTL_PRAGMA 文件控件,它使VFS实现有机会添加新的 PRAGMA 语句或覆盖内置 PRAGMA 语句的含义。
编译指示: 隐藏
语用值: 隐藏
签名号码: 节目
一个 pragma 可以接受零个或一个参数。参数 is 可以放在括号中,也可以用等号与 pragma 名称隔开。这两种语法产生相同的结果。在许多 pragma 中,参数是布尔值。布尔值可以是以下之一:
1 是 true on
0 no false off
关键字参数可以选择出现在引号中。(例如: 'yes' [FALSE]。)一些编译指示将字符串文字作为参数。当 pragma 采用关键字参数时,它通常也会采用数字等价物。例如,“0”和“no”的含义相同,“1”和“yes”也一样。查询设置的值时,许多 pragma 返回数字而不是关键字。
pragma 可以在 pragma 名称之前有一个可选的模式 名称。schema-name是ATTACH -ed 数据库的名称,或者是 main 和 TEMP 数据库的“main”或“temp”。如果省略了可选的模式名称,则假定为“main”。在某些 pragma 中,模式名称是没有意义的,只是被忽略了。在下面的文档中,模式名称对其有意义的编译指示显示为带有“模式。 ”前缀。
可以从普通的SELECT语句作为表值函数访问返回结果且没有副作用的 PRAGMA 。对于每个参与的 PRAGMA,对应的表值函数与带有 7 个字符“pragma_”前缀的 PRAGMA 具有相同的名称。PRAGMA 参数和模式(如果有)作为参数传递给表值函数,模式作为可选的最后一个参数。
例如,可以使用index_info pragma读取有关索引中列的信息,如下所示:
PRAGMA index_info('idx52');
或者,可以使用以下命令读取相同的内容:
SELECT * FROM pragma_index_info('idx52');
表值函数格式的优点是查询可以只返回 PRAGMA 列的子集,可以包含 WHERE 子句,可以使用聚合函数,并且表值函数可以只是一个数据源中的几个数据源之一。加入。例如,要获取架构中所有索引列的列表,可以查询:
SELECT DISTINCT m.name || '。' || ii.name AS '索引列' 从 sqlite_schema AS m, pragma_index_list(m.name) AS il, pragma_index_info(il.name) AS ii WHERE m.type='表' 按 1 排序;
补充说明:
表值函数仅适用于内置 PRAGMA,不适用于使用SQLITE_FCNTL_PRAGMA文件控件定义的 PRAGMA。
表值函数仅适用于返回结果且没有副作用的 PRAGMA。
此功能可用于 通过首先使用创建单独的模式 来实现信息模式
然后在该模式中创建 使用表值PRAGMA函数实现官方信息模式表的视图。ATTACH ':memory:' AS 'information_schema';
此功能是实验性的,可能会发生变化。如果正式支持 PRAGMAs 功能的表值函数,则将提供进一步的文档。
在 SQLite 版本 3.16.0 (2017-01-02) 中添加了 PRAGMA 功能的表值函数。SQLite 的早期版本无法使用此功能。
笔记:
PRAGMA 分析_限制;
PRAGMA analysis_limit = N ;
查询或更改近似分析设置的限制。这是ANALYZE命令在每个索引中检查的大致行数。如果参数N省略,则分析限不变。如果限制为零,则禁用分析限制,ANALYZE 命令将检查每个索引的所有行。如果 N 大于零,则分析限制设置为 N,随后的 ANALYZE 命令将在检查大约 N 行后停止分析每个索引。如果 N 是负数或不是整数值,则编译指示的行为就像省略了 N 参数一样。在所有情况下,返回的值都是用于后续 ANALYZE 命令的新分析限制。
此编译指示可用于帮助 ANALYZE 命令在大型数据库上运行得更快。当只检查每个指标的一部分时,分析结果并不好,但结果通常足够好。将 N 设置为 100 或 1000 可使 ANALYZE 命令运行得非常快,即使在数 GB 的数据库文件上也是如此。此 pragma 与PRAGMA optimize结合使用特别有用。
此编译指示是在 SQLite 版本 3.32.0 (2020-05-22) 中添加的。当前实现仅使用 N 值的低 31 位 - 高位被忽略。SQLite 的未来版本可能会开始使用高阶位。
PRAGMA模式。应用程序ID;
PRAGMA模式。application_id =整数;
application_id PRAGMA 用于查询或设置位于数据库标头偏移量 68 处的 32 位有符号大端“应用程序 ID”整数。使用 SQLite 作为其 应用程序文件格式的应用程序应将应用程序 ID 整数设置为唯一整数,以便诸如 file(1)之类的实用程序可以确定特定的文件类型,而不仅仅是报告“SQLite3 数据库”。可以通过查阅 SQLite 源存储库中 的magic.txt文件查看分配的应用程序 ID 列表。
另请参见user_version 杂注。
PRAGMA模式。自动真空;
PRAGMA模式。自动真空 = 0 | 无 | 1 | 完整 | 2 | 增量;
查询或设置数据库的自动清空状态。
auto-vacuum 的默认设置是 0 或“none”,除非使用SQLITE_DEFAULT_AUTOVACUUM编译时选项。“none”设置意味着禁用自动真空。当禁用自动清理并从数据库中删除数据时,数据库文件的大小保持不变。未使用的数据库文件页面被添加到“ freelist ”中,并重复用于后续插入。因此不会丢失任何数据库文件空间。但是,数据库文件不会收缩。在这种模式下,VACUUM 命令可用于重建整个数据库文件,从而回收未使用的磁盘空间。
当 auto-vacuum 模式为 1 或“full”时,freelist 页面被移动到数据库文件的末尾,并且数据库文件被截断以在每次事务提交时删除 freelist 页面。但是请注意,自动清理只会截断文件中的空闲列表页面。Auto-vacuum 不会像 VACUUM命令那样对数据库进行碎片整理,也不会重新打包单个数据库页面。事实上,因为它在文件中移动页面,所以自动真空实际上会使碎片变得更糟。
仅当数据库存储了一些允许每个数据库页面向后追溯到其引用者的附加信息时,才可能进行自动清理。因此,必须在创建任何表之前打开自动清理。创建表后无法启用或禁用自动清理。
当 auto-vacuum 的值为 2 或“增量”时,执行自动清理所需的附加信息将存储在数据库文件中,但自动清理不会像 auto_vacuum=full 那样在每次提交时自动发生。在增量模式下, 必须调用单独的incremental_vacuum pragma 以导致自动真空发生。
可以随时在完全和增量自动清理模式之间更改数据库连接。但是,只有当数据库是新的(尚未创建表)或运行VACUUM命令时,才能从“无”更改为“完整”或“增量”。要更改自动真空模式,首先使用 auto_vacuum pragma 设置新的所需模式,然后调用VACUUM命令重新组织整个数据库文件。要从“完整”或“增量”更改回“无”,即使在空数据库上也 总是需要运行VACUUM 。
当不带参数调用 auto_vacuum pragma 时,它返回当前的 auto_vacuum 模式。
PRAGMA 自动索引;
PRAGMA 自动索引 =布尔值;
查询、设置或清除自动索引功能。
从版本 3.7.17 (2013-05-20) 开始,默认启用 自动索引,但这可能会在 SQLite 的未来版本中发生变化。
PRAGMA 忙_超时;
PRAGMA busy_timeout =毫秒;
查询或更改 忙超时设置。此 pragma 是sqlite3_busy_timeout() C 语言接口的替代方法,该接口可作为 pragma 用于不提供对sqlite3_busy_timeout()的直接访问的语言绑定。
每个数据库连接只能有一个 繁忙的处理程序。此 PRAGMA 设置进程的繁忙处理程序,可能会覆盖任何先前设置的繁忙处理程序。
PRAGMA模式。缓存大小;
PRAGMA模式。缓存大小=页;
PRAGMA模式。cache_size = -千字节;
查询或更改 SQLite 将在每个打开的数据库文件中一次保存在内存中的建议的最大数据库磁盘页数。这个建议是否被接受由 Application Defined Page Cache决定。SQLite 内置的默认页面缓存支持请求,但是替代的应用程序定义的页面缓存实现可能会选择以不同的方式解释建议的缓存大小或一起忽略它。默认建议的缓存大小为 -2000,这意味着缓存大小限制为 2048000 字节的内存。可以使用 SQLITE_DEFAULT_CACHE_SIZE编译时选项更改默认的建议缓存大小。TEMP 数据库的默认建议缓存大小为 0 页。
如果参数 N 为正,则建议的缓存大小设置为 N。如果参数 N 为负,则将缓存页数调整为将使用大约 abs(N*1024) 字节内存的页数基于当前页面大小。SQLite 记住页缓存中的页数,而不是使用的内存量。因此,如果您使用负数设置缓存大小并随后更改页面大小(使用 PRAGMA page_size命令),那么最大缓存内存量将与页面大小的变化成比例地上升或下降。
向后兼容性说明: 带有负 N 的 cache_size 的行为在版本 3.7.10 (2012-01-16) 之前有所不同。在早期版本中,缓存中的页数设置为 N 的绝对值。
当您使用 cache_size pragma 更改缓存大小时,该更改仅持续当前会话。当数据库关闭并重新打开时,缓存大小恢复为默认值。
默认页面缓存实现不会一次性分配全部缓存内存。高速缓存内存根据需要以较小的块分配。page_cache 设置是缓存可以使用的内存量的(建议的)上限,而不是它将一直使用的内存量。这是默认页面缓存实现的行为,但 应用程序定义的页面缓存可以根据需要随意改变行为。
PRAGMA 缓存溢出;
PRAGMA cache_spill=布尔值;
PRAGMA模式。缓存溢出= N ;
cache_spill pragma 启用或禁用分页器在事务中间将脏缓存页面溢出到数据库文件的能力。Cache_spill 默认启用,大多数应用程序应该保留它,因为缓存溢出通常是有利的。但是,缓存溢出具有在数据库文件上获取独占锁的副作用 。因此,一些具有大量长时间运行事务的应用程序可能希望禁用缓存溢出,以防止应用程序在事务COMMIT之前获取数据库上的排他锁。
此 pragma的“PRAGMA cache_spill= N ”形式设置发生溢出所需的最小缓存大小阈值。缓存中的页数必须超过 cache_spill 阈值和PRAGMA cache_size语句设置的最大缓存大小,才能发生溢出。
此 pragma的“PRAGMA cache_spill= boolean ”形式适用于连接到数据库连接的所有数据库。但是该语句的“PRAGMA cache_spill= N ”形式仅适用于“主”模式或指定为语句一部分的任何其他模式。
PRAGMA case_sensitive_like = boolean ;
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 以前的实现。此编译指示仅更改 SQL LIKE运算符的行为。它不会改变sqlite3_strlike() C 语言接口的行为,该接口始终不区分大小写。
PRAGMA cell_size_check
PRAGMA cell_size_check = boolean ;
cell_size_check pragma 在最初从磁盘读取数据库 b 树页面时启用或禁用额外的健全性检查。启用单元大小检查后,可以更早地检测到数据库损坏并且不太可能“传播”。但是,执行额外检查会对性能造成很小的影响,因此默认情况下会关闭单元大小检查。
PRAGMA checkpoint_fullfsync
PRAGMA checkpoint_fullfsync = boolean ;
查询或更改检查点操作的 fullfsync 标志。如果设置了此标志,则在支持 F_FULLFSYNC 的系统上的检查点操作期间使用 F_FULLFSYNC 同步方法。checkpoint_fullsync 标志的默认值为关闭。只有 Mac OS-X 支持 F_FULLFSYNC。
如果设置了fullfsync标志,则 F_FULLFSYNC 同步方法用于所有同步操作,而 checkpoint_fullfsync 设置无关紧要。
PRAGMA collation_list;
返回为当前数据库连接定义的整理序列列表。
PRAGMA 编译选项;
此编译指示返回构建 SQLite 时使用的编译时选项的名称,每行一个选项。返回的选项名称中省略了“SQLITE_”前缀。另请参见 sqlite3_compileoption_get() C/C++ 接口和 sqlite_compileoption_get() SQL 函数。
PRAGMA count_changes;
PRAGMA count_changes = boolean ;
查询或更改计数更改标志。通常,当未设置 count-changes 标志时,INSERT、UPDATE和DELETE语句不返回任何数据。当设置了 count-changes 时,这些命令中的每一个都返回由一个整数值组成的单行数据 - 该命令插入、修改或删除的行数。返回的更改计数不包括由触发器执行的任何插入、修改或删除,由外键操作自动进行的任何更改,或由upsert引起的更新。
获取行更改计数的另一种方法是使用 sqlite3_changes()或sqlite3_total_changes()接口。但是,有一个微妙的不同。当使用INSTEAD OF 触发器对视图运行 INSERT、UPDATE 或 DELETE时,count_changes 杂注会报告视图中触发触发器的行数,而sqlite3_changes()和 sqlite3_total_changes()不会。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA 数据存储目录;
PRAGMA data_store_directory = '目录名';
查询或更改sqlite3_data_directory全局变量的值,Windows 操作系统接口后端使用该变量来确定存储使用相对路径名指定的数据库文件的位置。
更改 data_store_directory 设置不是线程安全的。如果应用程序中的另一个线程同时运行任何 SQLite 接口,则永远不要更改 data_store_directory 设置。这样做会导致未定义的行为。更改 data_store_directory 设置会写入sqlite3_data_directory全局变量,并且该全局变量不受互斥锁的保护。
此工具是为没有用于读取或更改当前工作目录的操作系统机制的 WinRT 提供的。不鼓励在任何其他上下文中使用此 pragma,并且可能在未来的版本中被禁止。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
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 数据库列表;
此编译指示的工作方式类似于查询,为附加到当前数据库连接的每个数据库返回一行。第二列是主数据库文件的“main”,用于存储 TEMP 对象的数据库文件的“temp”,或其他数据库文件的 ATTACHed 数据库的名称。第三列是数据库文件本身的名称,如果数据库与文件无关,则为空字符串。
PRAGMA模式。默认缓存大小;
PRAGMA模式。default_cache_size =页数;
此编译指示查询或设置每个打开的数据库文件将分配的磁盘缓存的建议最大页数。此 pragma 和cache_size之间的区别在于此处设置的值在数据库连接中保持不变。默认缓存大小的值存储在位于数据库文件头中偏移量 48 处的 4 字节大端整数中。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA defer_foreign_keys
PRAGMA defer_foreign_keys = boolean ;
当 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 = boolean ;
查询或更改 empty-result-callbacks 标志。
empty-result-callbacks 标志只影响sqlite3_exec() API。通常,当清空 empty-result-callbacks 标志时,不会为返回零行数据的命令调用提供给sqlite3_exec()的回调函数。在这种情况下设置 empty-result-callbacks 时,回调函数只调用一次,第三个参数设置为 0 (NULL)。这是为了使使用sqlite3_exec() API 的程序即使在查询没有返回数据时也能检索列名。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA 编码;
PRAGMA 编码 = 'UTF-8';
PRAGMA 编码 = 'UTF-16';
PRAGMA 编码 = 'UTF-16le';
PRAGMA 编码 = 'UTF-16be';
在第一种形式中,如果主数据库已经创建,那么这个编译指示返回主数据库使用的文本编码,'UTF-8'、'UTF-16le'(小端 UTF-16 编码)或' UTF-16be'(大端 UTF-16 编码)。如果尚未创建主数据库,则返回的值是将用于创建主数据库的文本编码,如果它是由该会话创建的。
此 pragma 的第二到第五种形式设置了主数据库在创建时将使用的编码(如果它是由该会话创建的)。字符串 'UTF-16' 被解释为“使用本机机器字节排序的 UTF-16 编码”。创建数据库后,无法更改其文本编码,并且任何尝试这样做都将被忽略。
如果没有使用此 pragma 设置编码,则创建主数据库时使用的编码默认为 用于打开连接的 API确定的编码。
一旦为数据库设置了编码,就无法更改。
由ATTACH命令创建的数据库始终使用与主数据库相同的编码。尝试使用与“主”数据库不同的文本编码附加数据库将失败。
PRAGMA模式。foreign_key_check;
PRAGMA模式。foreign_key_check(表名);
foreign_key_check pragma 检查数据库或名为“ table-name ”的表是否违反了 外键约束。foreign_key_check 杂注为每个外键违规返回一行输出。每个结果行中有四列。第一列是包含 REFERENCES 子句的表的名称。第二列是包含无效 REFERENCES 子句的行的rowid,如果子表是 WITHOUT ROWID ,则为 NULL桌子。第三列是引用的表的名称。第四列是失败的特定外键约束的索引。foreign_key_check pragma 输出中的第四列与 foreign_key_list pragma输出中的第一列是相同的整数。当指定“表名”时,检查的唯一外键约束是由表名的 CREATE TABLE 语句中的 REFERENCES 子句创建的那些。
PRAGMA foreign_key_list(表名);
此编译指示为表“ table-name ” 的 CREATE TABLE 语句中的 REFERENCES 子句创建的每个外键约束返回一行。
PRAGMA 外键;
PRAGMA foreign_keys = boolean ;
查询、设置或清除外键约束的执行。
此编译指示在事务中是无操作的;只有在没有挂起的BEGIN或SAVEPOINT时,才能启用或禁用外键约束强制 。
更改 foreign_keys 设置会影响使用数据库连接准备的所有语句的执行,包括在更改设置之前准备的语句。在更改 foreign_keys 设置后, 使用旧的 sqlite3_prepare()接口准备的任何现有语句都可能会失败并出现SQLITE_SCHEMA错误。
从 SQLite版本 3.6.19 开始,外键强制执行的默认设置为 OFF。但是,这可能会在 SQLite 的未来版本中发生变化。可以在编译时使用SQLITE_DEFAULT_FOREIGN_KEYS 预处理器宏指定外键强制执行的默认设置。为了尽量减少未来的问题,应用程序应根据应用程序的要求设置外键强制标志,而不是依赖于默认设置。
PRAGMA模式。freelist_count;
返回数据库文件中未使用的页数。
PRAGMA full_column_names;
PRAGMA full_column_names = boolean ;
查询或更改 full_column_names 标志。此标志与short_column_names标志一起确定 SQLite 将名称分配给SELECT语句的结果列的方式。通过按顺序应用以下规则来命名结果列:
如果结果中有 AS 子句,则列的名称是 AS 子句的右侧。
如果结果是通用表达式,而不仅仅是源表列的名称,则结果的名称是表达式文本的副本。
如果short_column_names pragma 为 ON,则结果的名称是不带源表名称前缀的源表列的名称:COLUMN。
如果 pragma short_column_names和full_column_names 都为 OFF,则适用情况 (2)。
结果列的名称是源表和源列名的组合:TABLE.COLUMN
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA fullfsync
PRAGMA fullfsync = boolean ;
查询或更改 fullfsync 标志。此标志确定是否在支持它的系统上使用 F_FULLFSYNC 同步方法。fullfsync 标志的默认值为 off。只有 Mac OS X 支持 F_FULLFSYNC。
另请参阅checkpoint_fullfsync。
PRAGMA 函数列表;
此编译指示返回数据库连接已知的 SQL 函数列表。结果的每一行描述了单个 SQL 函数的单个调用签名。如果可以(例如)使用不同数量的参数调用某些 SQL 函数或可以接受各种编码的文本,则某些 SQL 函数将在结果集中具有多行。
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 pragma。
PRAGMA ignore_check_constraints = boolean ;
此 pragma 启用或禁用 CHECK 约束的实施。默认设置为关闭,这意味着默认情况下强制执行 CHECK 约束。
PRAGMA模式。增量真空(N);
PRAGMA模式。增量真空;
incremental_vacuum pragma 导致从freelist中删除最多N个页面。数据库文件被截断相同的数量。如果数据库未处于 auto_vacuum=incremental模式或 freelist 上没有页面,则 incremental_vacuum pragma 无效。如果freelist 上的页数少于 N ,或者N小于 1,或者如果省略了 "( N )" 参数,则清除整个 freelist。
PRAGMA模式。索引信息(索引名称);
此编译指示为命名索引中的每个键列返回一行。键列是在创建索引的CREATE INDEX 索引语句或UNIQUE 约束或PRIMARY KEY 约束中实际命名的列。索引条目通常还包含指向被索引的表行的辅助列。index_info pragma 不显示辅助索引列,但 index_xinfo pragma列出了它们。
index_info pragma 的输出列如下:
如果没有名为index-name的索引,但存在具有该名称的 WITHOUT ROWID表,则(截至 2019 年 10 月 4 日的 SQLite版本 3.30.0)此编译指示返回 WITHOUT ROWID 表的 PRIMARY KEY 列,因为它们用于底层 b 树的记录中,也就是说删除了重复的列。
PRAGMA模式。index_list(表名);
此编译指示为与给定表关联的每个索引返回一行。
index_list pragma 的输出列如下:
PRAGMA模式。index_xinfo(索引名称);
此编译指示返回有关索引中每一列的信息。与此index_info pragma不同,此 pragma 返回有关索引中每一列的信息,而不仅仅是键列。(键列是在创建索引的CREATE INDEX 索引语句或UNIQUE 约束或PRIMARY KEY 约束中实际命名的列。辅助列是定位与每个索引条目对应的表条目所需的附加列。)
index_xinfo pragma 的输出列如下:
如果没有名为index-name的索引,但有一个 具有该名称的WITHOUT ROWID表,则(截至 2019 年 10 月 4 日的 SQLite版本 3.30.0)此编译指示返回 WITHOUT ROWID 表的列,因为它们被使用在底层 b 树的记录中,也就是说,首先是去重的 PRIMARY KEY 列,然后是数据列。
PRAGMA模式。完整性检查;
PRAGMA模式。完整性检查(N )
PRAGMA模式。完整性检查(表名)
此 pragma 对数据库进行低级格式化和一致性检查。完整性检查杂注寻找:
如果完整性检查杂注发现问题,则返回描述问题的字符串(作为多行,每行一列)。Pragma integrity_check 将在分析退出之前最多返回N 个错误,N 默认为 100。如果 pragma integrity_check 没有发现错误,则返回值为 'ok' 的单行。
通常的情况是检查整个数据库文件。但是,如果参数是TABLENAME,则仅对命名的表及其关联索引执行检查。这称为“部分完整性检查”。因为只检查数据库的一个子集,所以无法检测到错误,例如文件的未使用部分或两个或多个表重复使用文件的同一部分。如果TABLENAME是sqlite_schema或其别名之一,则仅在部分完整性检查中验证空闲列表。版本 3.33.0 (2020-08-14) 添加了对部分完整性检查的支持。
PRAGMA 完整性检查没有发现 FOREIGN KEY错误。使用PRAGMA foreign_key_check命令查找 FOREIGN KEY 约束中的错误。
另请参阅PRAGMA quick_check命令,该命令对 PRAGMA 完整性检查进行大部分检查,但运行速度更快。
PRAGMA模式。日记模式;
PRAGMA模式。日记模式 =删除 | 截断 | 坚持 | 内存 | 沃尔 | 离开
此 pragma 查询或设置与当前数据库连接关联的数据库的日志模式。
此 pragma 的第一种形式查询database的当前日志模式。省略数据库时,查询“主”数据库。
如果省略了“ database ”,则第二种形式会更改“ database ”或所有附加数据库的日志模式。返回新的日志模式。如果无法更改日志模式,则返回原始日志模式。
DELETE 日志模式是正常行为。在 DELETE 模式下,回滚日志在每个事务结束时被删除。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为 SQLite 中的原子提交的文档。)
TRUNCATE 日志模式通过将回滚日志截断为零长度而不是删除它来提交事务。在许多系统上,截断文件比删除文件要快得多,因为不需要更改包含目录。
PERSIST 日志模式可防止在每个事务结束时删除回滚日志。相反,日志的标题被零覆盖。这将防止其他数据库连接回滚日志。在删除或截断文件比用零覆盖文件的第一个块要昂贵得多的平台上,PERSIST 日志模式作为一种优化非常有用。另请参阅: PRAGMA journal_size_limit和SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT。
MEMORY 日志模式将回滚日志存储在易失性 RAM 中。这节省了磁盘 I/O,但以牺牲数据库安全性和完整性为代价。如果在设置 MEMORY 日志模式时使用 SQLite 的应用程序在事务中间崩溃,那么数据库文件很可能 会损坏。
WAL 日志模式使用预写日志而不是回滚日志来实现事务。WAL 日志模式是持久的;设置后,它在多个数据库连接以及关闭和重新打开数据库后仍然有效。WAL 日志模式下的数据库只能由 SQLite版本 3.7.0 (2010-07-21) 或更高版本访问。
OFF 日志模式完全禁用回滚日志。从未创建回滚日志,因此永远不会删除回滚日志。OFF 日志模式禁用 SQLite 的原子提交和回滚功能。ROLLBACK命令不再起作用;它的行为方式未定义。当日志模式关闭时,应用程序必须避免使用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模式。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 名称之前指定的单个数据库上运行(如果未指定数据库,则在“主”数据库上运行。)无法使用单个 PRAGMA 语句更改所有附加数据库的日志大小限制。必须为每个附加的数据库单独设置大小限制。
PRAGMA legacy_alter_table;
PRAGMA legacy_alter_table =布尔值
此编译指示设置或查询 legacy_alter_table 标志的值。当此标志打开时,ALTER TABLE RENAME 命令(用于更改表的名称)就像在 SQLite 3.24.0 (2018-06-04) 及更早版本中一样工作。更具体地说,当此标志位于ALTER TABLE RENAME命令上时,仅在其CREATE TABLE语句以及任何关联的 CREATE INDEX和CREATE TRIGGER语句中重写表名的初始出现。对表格的其他引用未修改,包括:
此 pragma 的默认设置为 OFF,这意味着对架构中任何位置的表的所有引用都将转换为新名称。
提供此 pragma 作为旧程序的解决方法,这些程序包含的代码预期在旧版本的 SQLite 中发现的ALTER TABLE RENAME的不完整行为。新应用程序应关闭此标志。
为了与较旧的虚拟表实现兼容,在运行sqlite3_module.xRename 方法时临时打开此标志。此标志的值在 sqlite3_module.xRename方法完成后恢复。
也可以使用sqlite3_db_config()接口 的SQLITE_DBCONFIG_LEGACY_ALTER_TABLE选项来 打开和关闭旧的 alter table 行为。
传统的 alter table 行为是每个连接的设置。打开或关闭此功能会影响 数据库连接中的所有附加数据库文件。该设置不会持续存在。在一个连接中更改此设置不会影响任何其他连接。
PRAGMA legacy_file_format;
此编译指示不再起作用。它已成为无操作。以前由 PRAGMA legacy_file_format 提供的功能现在可以使用sqlite3_db_config() C 语言接口 的SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 选项获得。
PRAGMA模式。锁定模式;
PRAGMA模式。锁定模式=正常| 独家的
此 pragma 设置或查询数据库连接锁定模式。锁定模式是 NORMAL 或 EXCLUSIVE。
在 NORMAL 锁定模式下(除非在编译时使用SQLITE_DEFAULT_LOCKING_MODE覆盖,否则默认设置),数据库连接在每次读取或写入事务结束时解锁数据库文件。当锁定模式设置为 EXCLUSIVE 时,数据库连接永远不会释放文件锁。第一次以 EXCLUSIVE 模式读取数据库时,会获得并持有共享锁。第一次写入数据库时,会获得并持有一个排他锁。
由 EXCLUSIVE 模式下的连接获得的数据库锁可以通过关闭数据库连接或通过使用此 pragma 将锁定模式设置回 NORMAL 然后访问数据库文件(用于读取或写入)来释放。仅将锁定模式设置为 NORMAL 是不够的 - 直到下次访问数据库文件时才会释放锁定。
将锁定模式设置为 EXCLUSIVE 有三个原因。
当locking_mode pragma 指定一个特定的数据库时,例如:
杂注 主要。锁定模式=独家;
那么锁定模式仅适用于命名数据库。如果“locking_mode”关键字之前没有数据库名称限定符,则锁定模式将应用于所有数据库,包括由后续ATTACH命令添加的任何新数据库。
“临时”数据库(其中存储 TEMP 表和索引)和内存数据库 始终使用独占锁定模式。临时数据库和 内存数据库的锁定模式无法更改。默认情况下,所有其他数据库都使用普通锁定模式,并受此 pragma 影响。
如果第一次进入 WAL 日志模式时锁定模式是 EXCLUSIVE ,那么在退出 WAL 日志模式之前,锁定模式不能更改为 NORMAL 。如果第一次进入 WAL 日志模式时锁定模式为 NORMAL,则锁定模式可以在 NORMAL 和 EXCLUSIVE 之间切换,并且可以随时再次返回,而无需退出 WAL 日志模式。
PRAGMA模式。最大页数;
PRAGMA模式。max_page_count = N ;
查询或设置数据库文件的最大页数。两种形式的编译指示都返回最大页数。第二种形式尝试修改最大页数。最大页数不能减少到当前数据库大小以下。
PRAGMA模式。mmap_size;
PRAGMA模式。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 模块列表;
此 pragma 返回 向数据库连接注册 的虚拟表模块列表。
编译指示优化;
编译指示优化(掩码);
PRAGMA模式.optimize;
PRAGMA模式.optimize( MASK );
尝试优化数据库。前两种形式对所有模式进行了优化,后两种形式仅对指定的模式进行了优化。
为了获得最佳的长期查询性能而不需要对应用程序模式和 SQL 进行详细的工程分析,建议应用程序在关闭每个数据库连接之前运行“PRAGMA optimize”(不带参数) 。长时间运行的应用程序也可能受益于设置计时器以每隔几个小时运行一次“PRAGMA 优化”。
此编译指示通常是无操作或几乎无操作,并且非常快。但是,如果 SQLite 认为执行数据库优化(例如运行ANALYZE 或创建新索引)会提高未来查询的性能,那么可能会完成一些数据库 I/O。想要限制执行工作量的应用程序可以设置一个计时器, 如果 pragma 持续时间过长,该计时器将调用sqlite3_interrupt() 。或者,从 SQLite 3.32.0 开始,应用程序可以使用 PRAGMA analysis_limit= N来获得一些小的N值(几百或几千)来限制分析的深度。
该编译指示执行的优化细节预计会随着时间的推移而改变和改进。应用程序应预期此编译指示将在未来版本中执行新的优化。
可选的 MASK 参数是要执行的优化的位掩码:
调试模式。实际上不执行任何优化,而是为每个已完成的优化返回一行文本。默认关闭。
在可能受益的表上 运行ANALYZE 。默认开启。有关其他信息,请参见下文。
(尚未实现) 在数据库文件中记录当前会话的使用情况和性能信息,以便它可用于“优化”未来数据库连接运行的 pragma。
(尚未实现) 创建可能对最近查询有帮助的索引。
默认的 MASK 是并且总是应该是 0xfffe。0xfffe 掩码意味着执行上面列出的所有优化,调试模式除外。如果将来添加了默认情况下应该关闭的新优化,则这些新优化将被赋予 0x10000 或更大的掩码。
要查看所有未实际执行的优化,请运行“PRAGMA optimize(-1)”。要仅使用 ANALYZE 优化,请运行“PRAGMA optimize(0x02)”。
确定何时运行分析
在当前实现中,当且仅当满足以下所有条件时,才会分析表:
MASK 位 0x02 已设置。
查询计划器在当前连接的生命周期中的某个时间点对表的一个或多个索引 使用sqlite_stat1样式的统计信息。
表的一个或多个索引当前未分析,或者 自上次运行 ANALYZE 以来表中的行数增加了 25 倍或更多。
何时分析表的规则可能会在未来版本中更改。
PRAGMA模式。页数;
返回数据库文件中的总页数。
PRAGMA模式。页面大小;
PRAGMA模式。page_size =字节;
查询或设置数据库的页面大小。页面大小必须是 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 = boolean ;
如果 SQLite 已使用SQLITE_DEBUG编译时选项编译,则 parser_trace pragma 可用于打开 SQLite 内部使用的 SQL 解析器的跟踪。此功能用于调试 SQLite 本身。
此编译指示旨在用于调试 SQLite 本身。它仅在使用SQLITE_DEBUG编译时选项时可用。
PRAGMA pragma_list;
此 pragma 返回数据库连接已知的 PRAGMA 命令列表。
PRAGMA query_only;
PRAGMA query_only = boolean ;
启用后,query_only 杂注可防止数据库文件上的数据更改。启用此 pragma 后,任何 CREATE、DELETE、DROP、INSERT 或 UPDATE 尝试都将导致SQLITE_READONLY错误。然而,数据库并不是真正的只读的。您仍然可以运行检查点或COMMIT ,并且sqlite3_db_readonly()例程的返回值 不受影响。
PRAGMA模式。快速检查;
PRAGMA模式。quick_check( N )
PRAGMA模式。快速检查(表名)
pragma 类似于完整性检查,只是它不验证 UNIQUE 约束,也不验证索引内容是否与表内容匹配。通过跳过 UNIQUE 和索引一致性检查,quick_check 能够运行得更快。PRAGMA quick_check 在 O(N) 时间内运行,而PRAGMA integrity_check 需要 O(NlogN) 时间,其中 N 是数据库中的总行数。否则,这两个 pragma 是相同的。
PRAGMA read_uncommitted;
PRAGMA read_uncommitted = boolean ;
查询、设置或清除 READ UNCOMMITTED 隔离。SQLite 的默认隔离级别是 SERIALIZABLE。任何进程或线程都可以选择 READ UNCOMMITTED 隔离,但 SERIALIZABLE 仍将被使用,除非在共享公共页面和模式缓存的连接之间。使用sqlite3_enable_shared_cache() API启用缓存共享。默认情况下禁用缓存共享。
有关更多信息,请参阅SQLite 共享缓存模式。
PRAGMA 递归触发器;
PRAGMA recursive_triggers = boolean ;
查询、设置或清除递归触发能力。
更改 recursive_triggers 设置会影响使用数据库连接准备的所有语句的执行,包括在更改设置之前准备的语句。更改 recursive_triggers 设置后, 使用旧的 sqlite3_prepare()接口准备的任何现有语句都可能会失败并出现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 = boolean ;
启用后,此 PRAGMA 会导致许多没有 ORDER BY 子句的SELECT语句以与正常情况相反的顺序发出结果。这可以帮助调试对结果顺序做出无效假设的应用程序。reverse_unordered_selects pragma 适用于大多数 SELECT 语句,但是查询计划器有时可能会选择一个不容易反转的算法,在这种情况下,无论 reverse_unordered_selects 设置如何,输出都将以相同的顺序出现。
如果 SELECT 省略了 ORDER BY 子句,SQLite 不保证结果的顺序。即便如此,结果的顺序不会从一次运行到下一次发生变化,因此许多应用程序错误地依赖于任意输出顺序,无论该顺序是什么。但是,有时新版本的 SQLite 将包含优化器增强功能,这将导致没有 ORDER BY 子句的查询的输出顺序发生变化。发生这种情况时,依赖于特定输出顺序的应用程序可能会出现故障。通过在禁用和启用此 pragma 的情况下多次运行应用程序,可以尽早识别和修复应用程序对输出顺序做出错误假设的情况,
PRAGMA模式。架构版本;
PRAGMA模式。schema_version =整数;
schema_version pragma 将获取或设置数据库标头 中偏移量 40 处的架构版本整数的值 。
每当架构更改时,SQLite 都会自动增加架构版本。在每条 SQL 语句运行时,都会检查模式版本以确保自 SQL 语句准备好后模式没有改变。使用“PRAGMA schema_version”颠覆这一机制可能会导致 SQL 语句使用过时的模式运行,这可能导致错误答案和/或 数据库损坏。
警告: 滥用此编译指示可能导致数据库损坏。
出于此 pragma 的目的,VACUUM命令被认为是模式更改,因为VACUUM通常会更改sqlite_schema 表中条目的“rootpage”值。
另请参见application_id pragma和user_version pragma。
PRAGMA模式。安全删除;
PRAGMA模式。安全删除 =布尔值| 快速地
查询或更改安全删除设置。当secure_delete 开启时,SQLite 用零覆盖已删除的内容。secure_delete 的默认设置由SQLITE_SECURE_DELETE 编译时选项确定,并且通常处于关闭状态。secure_delete 的 off 设置通过减少 CPU 周期数和磁盘 I/O 量来提高性能。希望避免在删除或更新内容后留下取证痕迹的应用程序应在执行删除或更新之前启用secure_delete pragma,或者在删除或更新之后运行VACUUM。
Secure_delete 的“快速”设置(大约在 2017 年 8 月 1 日添加)是介于“开”和“关”之间的中间设置。当secure_delete 设置为“fast”时,只有在不增加I/O 量的情况下,SQLite 才会用零覆盖已删除的内容。换句话说,“快速”设置使用更多的 CPU 周期,但不使用更多的 I/O。这具有从b-tree 页面中清除所有旧内容的效果,但会在freelist 页面上留下取证痕迹。
当存在附加的数据库并且在 pragma 中未指定数据库时,所有数据库的安全删除设置都会更改。新附加数据库的安全删除设置是评估 ATTACH 命令时主数据库的设置。
当多个数据库连接共享同一个缓存时,更改一个数据库连接上的安全删除标志会更改所有连接。
PRAGMA 短列名称;
PRAGMA short_column_names = boolean ;
查询或更改短列名称标志。此标志影响 SQLite 命名SELECT语句返回的数据列的方式。有关完整详细信息,请参阅full_column_names pragma。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA 收缩内存
这个 pragma 通过调用sqlite3_db_release_memory()导致调用它的数据库连接尽可能多地释放内存 。
PRAGMA soft_heap_limit
PRAGMA soft_heap_limit= N
如果指定了 N 并且是非负整数,则此 pragma 使用参数 N 调用sqlite3_soft_heap_limit64()接口。soft_heap_limit pragma 总是返回与sqlite3_soft_heap_limit64 (-1) C 语言函数返回的整数相同的整数。
另请参见hard_heap_limit 杂注。
编译指示统计;
此编译指示返回有关表和索引的辅助信息。在测试期间使用返回的信息来帮助验证查询计划器是否正常运行。此编译指示的格式和含义可能会从一个版本更改为下一个版本。由于它的易变性,这个 pragma 的行为和输出格式是故意没有记录的。
此 pragma 的预期用途仅用于测试和验证 SQLite。此编译指示如有更改,恕不另行通知,不建议应用程序使用。
PRAGMA模式。同步;
PRAGMA模式。同步 = 0 | 关闭 | 1 | 正常 | 2 | 完整 | 3 | 额外;
查询或更改“同步”标志的设置。第一个(查询)表单将同步设置作为整数返回。第二种形式更改同步设置。各种同步设置的含义如下:
额外(3)
EXTRA 同步类似于 FULL,除了包含回滚日志的目录在取消链接以在 DELETE 模式下提交事务后同步。如果提交紧跟在断电之后,EXTRA 会提供额外的持久性。
满(2)
当同步为 FULL (2) 时,SQLite 数据库引擎将使用VFS的 xSync 方法来确保在继续之前将所有内容安全地写入磁盘表面。这可确保操作系统崩溃或电源故障不会损坏数据库。FULL 同步非常安全,但速度也较慢。FULL 是不处于WAL 模式时最常用的同步设置。
正常(1)
当同步为 NORMAL (1) 时,SQLite 数据库引擎仍会在最关键的时刻同步,但频率低于 FULL 模式。在错误的时间发生电源故障可能会损坏旧文件系统上journal_mode =DELETE 中 的数据库的可能性非常小(尽管非零) 。WAL模式同步 = NORMAL 时可以避免损坏,并且在现代文件系统上可能 DELETE 模式也是安全的。WAL 模式始终与 synchronous=NORMAL 一致,但 WAL 模式确实会失去持久性。在 WAL 模式下以 synchronous=NORMAL 提交的事务可能会在断电或系统崩溃后回滚。无论同步设置或日志模式如何,事务在应用程序崩溃时都是持久的。对于在WAL 模式下运行的大多数应用程序,同步 = NORMAL 设置是一个不错的选择。
关(0)
使用同步 OFF (0),SQLite 在将数据移交给操作系统后继续进行而不进行同步。如果运行 SQLite 的应用程序崩溃,数据将是安全的,但如果操作系统崩溃或计算机在数据写入磁盘表面之前断电,则数据库可能会损坏。另一方面,同步关闭的提交可以快几个数量级。
在WAL模式下,当 synchronous 为 NORMAL (1) 时,WAL 文件在每个检查点之前同步,数据库文件在每个完成检查点之后同步当一个 WAL 文件在一个检查点之后开始被重用时,WAL 文件头是同步的,但在大多数事务期间不会发生同步操作。在 WAL 模式下使用 synchronous=FULL,每次事务提交后都会对 WAL 文件进行额外的同步操作。每个事务之后的额外 WAL 同步有助于确保事务在断电时是持久的。事务与 synchronous=FULL 提供的额外同步或不同步都是一致的。如果不考虑持久性,那么 synchronous=NORMAL 通常是 WAL 模式下的全部需求。
TEMP 模式始终具有 synchronous=OFF,因为 TEMP 的内容是短暂的,预计不会在断电后继续存在。尝试更改 TEMP 的同步设置将被静默忽略。
另请参阅fullfsync和checkpoint_fullsync pragma。
PRAGMA模式。表信息(表名);
此编译指示为命名表中的每一列返回一行。结果集中的列包括列名、数据类型、列是否可以为 NULL,以及列的默认值。对于不属于主键的列,结果集中的“pk”列为零,对于属于主键的列,它是主键中的列的索引。
table_info pragma 中命名的表也可以是视图。
另请参阅:PRAGMA table_xinfo
PRAGMA 表列表;
PRAGMA模式。表列表;
PRAGMA 表列表(表名);
此编译指示返回有关模式中的表和视图的信息,每行输出一个表。table_list pragma 首次出现在 SQLite 版本 3.37.0 (2021-11-27)。从最初的版本开始,table_list pragma 返回的列包括下面列出的那些。SQLite 的未来版本可能会添加额外的输出列。
默认行为是显示所有模式中的所有表。如果 架构。name 出现在 pragma 之前,然后只显示该模式中的表。如果提供了表名参数,则只返回有关该表的信息。
PRAGMA模式。table_xinfo(表名);
此编译指示为命名表中的每一列返回一行,包括虚拟表中的隐藏列。输出与PRAGMA table_info的输出相同,除了显示而不是省略隐藏列。
PRAGMA temp_store;
PRAGMA temp_store = 0 | 默认 | 1 | 文件 | 2 | 内存;
查询或更改“ temp_store ”参数的设置。当 temp_store 为 DEFAULT (0) 时,编译时 C 预处理器宏 SQLITE_TEMP_STORE用于确定临时表和索引的存储位置。当 temp_store 为 MEMORY (2) 时,临时表和索引就像在纯内存数据库中一样保存。当 temp_store 为 FILE (1) 时,临时表和索引存储在文件中。temp_store_directory pragma 可用于在 FILE 时指定包含临时文件 的目录被指定。当 temp_store 设置更改时,所有现有的临时表、索引、触发器和视图都将立即删除。
库编译时 C 预处理器符号 SQLITE_TEMP_STORE可以覆盖此编译指示设置。下表总结了SQLITE_TEMP_STORE预处理器宏和 temp_store pragma 的交互:
SQLITE_TEMP_STORE PRAGMA
temp_store用于
TEMP 表和索引的存储0 任何 文件 1 0 文件 1 1 文件 1 2 记忆 2 0 记忆 2 1 文件 2 2 记忆 3 任何 记忆
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = '目录名';
查询或更改sqlite3_temp_directory全局变量的值,许多操作系统接口后端使用该变量来确定存储临时表和索引的位置。
当 temp_store_directory 设置更改时,会立即删除发出 pragma 的数据库连接中的所有现有临时表、索引、触发器和查看器。实际上,应在打开进程的第一个数据库连接后立即设置 temp_store_directory。如果一个数据库连接的 temp_store_directory 发生更改,而其他数据库连接在同一进程中打开,则该行为是未定义的并且可能是不可取的。
更改 temp_store_directory 设置不是线程安全的。如果应用程序中的另一个线程同时运行任何 SQLite 接口,则永远不要更改 temp_store_directory 设置。这样做会导致未定义的行为。更改 temp_store_directory 设置会写入sqlite3_temp_directory全局变量,并且该全局变量不受互斥锁的保护。
值directory-name应该用单引号引起来。要将目录恢复为默认目录,请将目录名称设置为空字符串,例如PRAGMA temp_store_directory = ''。如果未找到目录名或目录名不可写,则会引发错误。
临时文件的默认目录取决于操作系统。一些操作系统接口可能会选择忽略此变量并将临时文件放置在与此处指定的目录不同的其他目录中。从这个意义上说,这个 pragma 只是建议性的。
此编译指示已弃用,仅用于向后兼容。新应用程序应避免使用此编译指示。较旧的应用程序应尽早停止使用此编译指示。当使用SQLITE_OMIT_DEPRECATED编译 SQLite 时,可以从构建中省略此编译指示。
PRAGMA 线程;
PRAGMA 线程 = N ;
查询或更改当前数据库连接的 sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...) 限制的值。此限制设置允许准备好的语句启动以协助查询的辅助线程数的上限。默认限制为 0,除非使用SQLITE_DEFAULT_WORKER_THREADS 编译时选项进行更改。当限制为零时,这意味着不会启动辅助线程。
这个 pragma 是 sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...) 接口的薄包装。
PRAGMA 可信模式;
PRAGMAtrusted_schema = boolean ;
trusted_schema 设置是每个连接的布尔值,它确定是否允许视图、触发器或模式表达式(例如CHECK 约束、 DEFAULT 子句、生成)运行未经安全审计的 SQL 函数和虚拟表列、表达式索引和/或 部分索引。也可以使用sqlite3_db_config (db, SQLITE_DBCONFIG_TRUSTED_SCHEMA ,...) C 语言界面来控制此设置。
为了保持向后兼容性,此设置默认为 ON。关闭它有很多好处,如果关闭它,大多数应用程序都不会受到影响。因此,鼓励所有应用程序在每个数据库连接打开后立即关闭该设置。
-DSQLITE_TRUSTED_SCHEMA =0编译时选项将导致此设置默认为 OFF。
PRAGMA模式。用户版本;
PRAGMA模式。用户版本 =整数;
user_version pragma 将获取或设置 数据库标头中偏移量 60 处的用户版本整数的值。user-version 是一个整数,应用程序可以根据需要使用它。SQLite 不使用用户版本本身。
另请参见application_id pragma和schema_version pragma。
PRAGMA vdbe_addoptrace = boolean ;
如果 SQLite 已使用SQLITE_DEBUG编译时选项进行编译,则 vdbe_addoptrace pragma 可用于显示完整的 VDBE 操作码,因为它们是在代码生成期间创建的。此功能用于调试 SQLite 本身。有关详细信息,请参阅 VDBE 文档。
此编译指示旨在用于调试 SQLite 本身。它仅在使用SQLITE_DEBUG编译时选项时可用。
PRAGMA vdbe_debug = boolean ;
如果 SQLite 已使用SQLITE_DEBUG编译时选项进行编译,则 vdbe_debug pragma 是其他三个仅调试 pragma 的简写:vdbe_addoptrace、vdbe_listing 和 vdbe_trace。此功能用于调试 SQLite 本身。有关详细信息,请参阅 VDBE 文档。
此编译指示旨在用于调试 SQLite 本身。它仅在使用SQLITE_DEBUG编译时选项时可用。
PRAGMA vdbe_listing = boolean ;
如果 SQLite 已使用SQLITE_DEBUG编译时选项进行编译,则 vdbe_listing pragma 可用于在评估每个语句时使虚拟机操作码的完整列表出现在标准输出中。启用列表后,程序的全部内容将在开始执行之前打印出来。该语句在列表打印后正常执行。此功能用于调试 SQLite 本身。有关详细信息,请参阅 VDBE 文档。
此编译指示旨在用于调试 SQLite 本身。它仅在使用SQLITE_DEBUG编译时选项时可用。
PRAGMA vdbe_trace = boolean ;
如果 SQLite 已使用SQLITE_DEBUG编译时选项进行编译,则 vdbe_trace pragma 可用于在评估虚拟机操作码时将其打印在标准输出上。此功能用于调试 SQLite。有关详细信息,请参阅 VDBE 文档。
此编译指示旨在用于调试 SQLite 本身。它仅在使用SQLITE_DEBUG编译时选项时可用。
PRAGMA wal_autocheckpoint;
PRAGMA wal_autocheckpoint= N ;
此编译指示查询或设置预写日志 自动检查点间隔。启用预写日志时(通过 journal_mode pragma ),只要预写日志的长度等于或超过N页,就会自动运行检查点。将自动检查点大小设置为零或负值会关闭自动检查点。
这个 pragma 是 sqlite3_wal_autocheckpoint() C 接口的包装器。所有自动检查点都是被动的。
默认情况下启用自动检查点,间隔为 1000 或SQLITE_DEFAULT_WAL_AUTOCHECKPOINT。
PRAGMA模式。wal_checkpoint;
PRAGMA模式。wal_checkpoint(被动);
PRAGMA模式。wal_checkpoint(满);
PRAGMA模式。wal_checkpoint(重新启动);
PRAGMA模式。wal_checkpoint(截断);
如果启用了预写日志(通过journal_mode pragma),则此 pragma 会导致检查点操作在数据库 database上运行,如果database 被省略,则在所有连接的数据库上运行。如果禁用了预写日志模式,则此编译指示是无害的无操作。
不带参数调用这个 pragma 等效于调用 sqlite3_wal_checkpoint() C 接口。
使用参数调用此 pragma 等效于 使用 对应于参数 的第三个参数调用sqlite3_wal_checkpoint_v2() C 接口 :
被动的
检查点尽可能多的帧,而无需等待任何数据库读取器或写入器完成。如果日志中的所有帧都设置了检查点,则同步 db 文件。此模式与调用 sqlite3_wal_checkpoint() C 接口相同。在这种 模式下,从不调用 busy-handler 回调。
满的
此模式阻塞(调用忙处理程序回调),直到没有数据库写入器并且所有读取器都从最近的数据库快照中读取。然后它检查日志文件中的所有帧并同步数据库文件。FULL 在运行时会阻止并发写入者,但读取者可以继续。
重新开始
此模式的工作方式与 FULL 相同,除了在检查点日志文件后它会阻塞(调用 忙处理程序回调),直到所有读取器完成日志文件。这可确保下一个要写入数据库文件的客户端从头开始重新启动日志文件。RESTART 在运行时阻止并发写入者,但允许读取者继续。
截短
此模式的工作方式与 RESTART 相同,除了 WAL 文件在成功完成后被截断为零字节。
wal_checkpoint pragma 返回包含三个整数列的单行。第一列通常为 0,但如果 RESTART 或 FULL 或 TRUNCATE 检查点被阻止完成,例如因为另一个线程或进程正在积极使用数据库,则第一列将为 1。换句话说,如果对sqlite3_wal_checkpoint_v2()的等效调用将返回SQLITE_OK ,则第一列为 0;如果等效调用将返回 SQLITE_BUSY ,则第一列为 1. 第二列是已写入预写日志文件的修改页数。第三列是在检查点结束时已成功移回数据库文件的预写日志文件中的页数。如果没有预写日志,则第二列和第三列为 -1,例如,如果在非WAL 模式的数据库连接上调用此编译指示。
PRAGMA writable_schema = boolean ;
PRAGMA writable_schema = RESET
当此 pragma 开启且SQLITE_DBCONFIG_DEFENSIVE标志关闭时,可以使用普通的UPDATE、INSERT和DELETE 语句更改sqlite_schema表。如果参数是“RESET”,那么模式写入被禁用(与“PRAGMA writable_schema=OFF”一样),此外,模式被重新加载。 警告: 滥用此编译指示很容易导致数据库文件损坏。