互动营销的概念,南宁seo教程,深圳云购网站制作,网站首页被k 内页还有返回#xff1a;SQLite—系列文章目录
上一篇#xff1a;SQLite从出生到现在#xff08;发布历史记录#xff09;#xff08;二十二#xff09;
下一篇#xff1a;用于 SQLite 的异步 I/O 模块#xff08;二十四#xff09; PRAGMA 语句是特定于 SQLite 的 SQL 扩…返回SQLite—系列文章目录
上一篇SQLite从出生到现在发布历史记录二十二
下一篇用于 SQLite 的异步 I/O 模块二十四 PRAGMA 语句是特定于 SQLite 的 SQL 扩展用于 修改 SQLite 库的操作或查询 SQLite 库 内部非表数据。PRAGMA声明使用相同的 接口作为其他 SQLite 命令例如 SELECT、INSERT但 在以下重要方面有所不同
pragma 命令特定于 SQLite并且是 与任何其他 SQL 数据库引擎不兼容。将来可能会删除特定的 pragma 语句并添加其他语句 SQLite的版本。不能保证向后兼容性。如果发出未知的编译指示则不会生成任何错误消息。 未知的编译指示被简单地忽略。这意味着如果 Pragma 语句 库不会通知用户这一事实。某些编译指示在 SQL 编译阶段生效而不是 执行阶段。这意味着如果使用 C 语言 sqlite3_prepare、sqlite3_step、sqlite3_finalize API或包装器中的类似 API 接口编译指示可以在 sqlite3_prepare 调用期间运行 而不是像普通 SQL 语句那样在 sqlite3_step 调用期间。 或者编译指示可能会像往常一样在 sqlite3_step 期间运行 SQL 语句。编译指示是否在 sqlite3_prepare 期间运行 或 sqlite3_step 取决于编译指示和特定版本 的 SQLite。SQL 语句的 EXPLAIN 和 EXPLAIN QUERY PLAN 前缀 仅影响语句在 sqlite3_step 期间的行为。 这意味着在 sqlite3_prepare 期间生效的 PRAGMA 语句的行为方式相同无论 不是它们以“解释”开头。
用于 SQLite 的 C 语言 API 提供了 SQLITE_FCNTL_PRAGMA 文件控件该控件为 VFS 实现提供了 有机会添加新的 PRAGMA 语句或覆盖 内置 PRAGMA 语句。 PRAGMA 命令语法
pragma-stmt 隐藏 普拉格玛架构名称.pragma-name(pragma-value)pragma-value pragma-value 隐藏 签名号码名字有符号文字 签名号码 显示 编译指示可以采用零个参数也可以采用一个参数。参数可能是 在括号中也可以用等号将其与 pragma 名称分开。 这两种语法产生相同的结果。 在许多编译指示中参数是布尔值。布尔值可以是以下项之一
1 是 真 开 0 否 假 关
关键字参数可以选择出现在引号中。 例如“yes” [FALSE]。一些编译指示 将字符串文本作为其参数。当 pragma 采用关键字时 参数它通常也需要一个数字等价物。 例如“0”和“否”的意思相同“1”和“是”也是如此。 查询设置的值时许多编译指示返回数字 而不是关键字。
杂注在杂注名称之前可能有一个可选的架构名称。 schema-name 是 ATTACH-ed 数据库的名称 或 main 和 TEMP 数据库的 “main” 或 “temp”。如果可选 省略架构名称假定为“main”。在某些编译指示中架构 名称毫无意义只是被忽略。在下面的文档中 架构名称有意义的编译指示显示 “模式。”前缀。 PRAGMA函数
返回结果且无副作用的 PRAGMA 可以是 作为表值函数从普通 SELECT 语句访问。 对于每个参与的 PRAGMA相应的表值函数 与PRAGMA同名前缀为7个字符的“pragma_”。 PRAGMA 参数和架构如果有将作为参数传递给 table-value 函数架构作为可选的最后一个参数。
例如有关索引中列的信息可以是 使用index_info编译指示读取如下所示 PRAGMA index_info(idx52);或者可以使用以下方法读取相同的内容 SELECT * FROM pragma_index_info(idx52);表值函数格式的优点是查询 可以只返回 PRAGMA 列的子集可以包含 WHERE 子句 可以使用聚合函数表值函数可以只是 联接中的多个数据源之一。 例如若要获取架构中所有索引列的列表一个 可以查询 SELECT DISTINCT m.name || . || ii.name AS indexed-columnsFROM sqlite_schema AS m,pragma_index_list(m.name) AS il,pragma_index_info(il.name) AS iiWHERE m.typetableORDER BY 1;附注事项 表值函数仅适用于内置 PRAGMA而不适用于 PRAGMA 使用 SQLITE_FCNTL_PRAGMA 文件控件定义。 表值函数仅适用于返回结果和 没有副作用。 此功能可用于实现信息架构方法是首先使用 ATTACH :memory: AS information_schema;然后在该架构中创建实现官方信息架构的 VIEW 使用表值 PRAGMA 函数的表。 添加了 PRAGMA 功能的表值函数 在 SQLite 版本 3.16.0 2017-01-02 中。SQLite 的早期版本 无法使用此功能。 PRAGMA列表 analysis_limitapplication_idauto_vacuumautomatic_indexbusy_timeoutcache_sizecache_spillcase_sensitive_like¹cell_size_checkcheckpoint_fullfsynccollation_listcompile_optionscount_changes¹data_store_directory¹data_versiondatabase_listdefault_cache_size¹defer_foreign_keysempty_result_callbacks¹编码foreign_key_checkforeign_key_listforeign_keysfreelist_countfull_column_names¹fullfsyncfunction_listhard_heap_limitignore_check_constraintsincremental_vacuumindex_infoindex_listindex_xinfointegrity_checkjournal_modejournal_size_limitlegacy_alter_tablelegacy_file_formatlocking_modemax_page_countmmap_sizemodule_list优化page_countpage_sizeparser_trace²pragma_listquery_onlyquick_checkread_uncommittedrecursive_triggersreverse_unordered_selectsschema_version³secure_deleteshort_column_names¹shrink_memorysoft_heap_limit统计³同步table_infotable_listtable_xinfotemp_storetemp_store_directory¹线程trusted_schemauser_versionvdbe_addoptrace²vdbe_debug²vdbe_listing²vdbe_trace²wal_autocheckpointwal_checkpointwritable_schema³ 笔记
名称被划掉的 Pragma 将被弃用。不要使用它们。它们存在 为了历史兼容性。这些编译指示仅在使用非标准的构建中可用 编译时选项。这些编译指示用于测试 SQLite不推荐使用 用于应用程序。
普拉格玛analysis_limit; PRAGMA analysis_limit N;
查询或更改近似 ANALYZE 设置的限制。 这是 通过 ANALYZE 命令在每个索引中检查的行。 如果省略参数 N则分析极限 保持不变。 如果限制为零则禁用分析限制并禁用 ANALYZE 命令将检查每个索引的所有行。 如果 N 大于零则分析限设置为 N 后续的 ANALYZE 命令将停止分析 每个索引在检查了大约 N 行之后。 如果 N 是负数或整数值以外的值 然后编译指示的行为就像省略了 N 参数一样。 在所有情况下返回的值都是使用的新分析限值 用于后续的 ANALYZE 命令。
此编译指示可用于帮助 ANALYZE 命令更快地运行 在大型数据库上。分析结果不那么好 当只检查每个索引的一部分但结果是 通常足够好。将 N 设置为 100 或 1000 允许 ANALYZE 命令运行速度非常快即使在数 GB 上也是如此 数据库文件。这种编译指示在组合时特别有用 使用 PRAGMA 优化。
本编译指示已在 SQLite 版本 3.32.0 2020-05-22 中添加。 当前实现仅使用 N 值 - 高阶位被静默忽略。未来版本 的 SQLite 可能会开始使用高阶位。
PRAGMA 架构。application_id; PRAGMA 架构。application_id 整数 ;
application_id PRAGMA 用于查询或设置 32 位 位于偏移量处的有符号 big-endian “应用程序 ID” 整数 68 进入数据库头。使用 SQLite 作为其应用程序文件格式的应用程序应将应用程序 ID 整数设置为 一个唯一的整数以便 file1 等实用程序可以确定特定的 文件类型而不仅仅是报告“SQLite3 数据库”。列表 通过查阅 SQLite 源存储库中的 magic.txt 文件可以查看分配的应用程序 ID。
另请参阅user_version编译指示。
PRAGMA 架构。auto_vacuum; PRAGMA 架构。auto_vacuum 0 |无 |1 |完整 |2 |增量;
查询或设置数据库中的自动抽真空状态。
自动吸尘的默认设置为 0 或“无” 除非使用 SQLITE_DEFAULT_AUTOVACUUM 编译时选项。 “无”设置表示自动吸尘被禁用。 当禁用自动清空功能并从数据库中删除数据时 数据库文件的大小保持不变。未使用的数据库文件 页面被添加到“自由列表”中并重新用于后续插入。所以 不会丢失任何数据库文件空间。但是数据库文件不会 收缩。在此模式下可以使用 VACUUM 命令重建整个数据库文件并 从而回收未使用的磁盘空间。
当自动清空模式为 1 或“已满”时自由列表页面为 移动到数据库文件的末尾数据库文件被截断 在每次交易提交时删除自由列表页面。 但请注意自动清空只会截断自由列表页面 从文件。自动清空不会对数据库进行碎片整理也不会对数据库进行碎片整理。 以 VACUUM 命令的方式重新打包单个数据库页。事实上因为 它在文件中移动页面自动真空实际上可以 使碎片化变得更糟。
只有当数据库存储了一些 允许每个数据库页的附加信息 向后追溯到其引用。因此自动吸尘必须 在创建任何表之前打开。这是不可能的 在创建表后启用或禁用自动清空。
当自动真空的值为 2 或“增量”时则额外的 执行自动清空所需的信息存储在数据库文件中 但是自动清空不会在每次提交时自动发生因为它 与 auto_vacuumfull 一起执行。在增量模式下单独的incremental_vacuum编译指示必须 被调用以导致自动真空发生。
数据库连接可以在完全连接和增量连接之间切换 自动真空模式。但是从 “none”到“full”或“incremental”只有在数据库出现时才会出现 是新的无表 尚未创建或运行 VACUUM 命令。自 更改自动吸尘模式首先使用auto_vacuum编译指示进行设置 新的所需模式然后调用 VACUUM 命令 重新组织整个数据库文件。从“完整”更改为 “增量”回到“无”总是需要运行 VACUUM甚至 在空数据库上。
当调用不带参数的auto_vacuum编译指示时它 返回当前auto_vacuum模式。
普拉格玛automatic_index; PRAGMA automatic_index 布尔值;
查询、设置或清除自动索引功能。
从版本 3.7.17 2013-05-20 开始默认情况下启用自动索引 但这在SQLite的未来版本中可能会发生变化。
普拉格玛busy_timeout; PRAGMA busy_timeout 毫秒;
查询或更改繁忙超时的设置。 此编译指示是 sqlite3_busy_timeout C 语言的替代方案 接口可作为编译指示与语言一起使用 不提供对 sqlite3_busy_timeout 的直接访问的绑定。
每个数据库连接只能有一个繁忙的处理程序。此 PRAGMA 设置繁忙的处理程序 对于该进程可能会覆盖任何以前设置的忙碌处理程序。
PRAGMA 架构。cache_size; PRAGMA 架构。cache_size 页; PRAGMA 架构。cache_size -千字节;
查询或更改建议的最大数据库磁盘页数 SQLite将立即保存在每个打开的数据库文件的内存中。是否 是否尊重此建议由应用程序定义的页面缓存自行决定。 SQLite内置的默认页面缓存支持请求 但是替代应用程序定义的页面缓存实现 可以选择以不同的方式解释建议的缓存大小 或者一起忽略它。 默认建议的缓存大小为 -2000即缓存大小 限制为 2048000 字节的内存。 可以使用 SQLITE_DEFAULT_CACHE_SIZE 编译时选项更改默认建议的缓存大小。 TEMP 数据库的默认建议缓存大小为 0 页。
如果参数 N 为正数则设置建议的缓存大小 到 N。如果参数 N 为负数则 缓存页数调整为将 使用大约 absN*1024 字节的内存基于当前 页面大小。SQLite会记住页面缓存中的页数 而不是使用的内存量。因此如果您使用 一个负数然后更改页面大小使用 PRAGMA page_size 命令然后更改最大缓存量 内存将随着页面大小的变化而上升或下降。
向后兼容性说明负 N 的cache_size的行为 在版本 3.7.10 2012-01-16 之前有所不同。在 在早期版本中设置了缓存中的页数 到 N 的绝对值。
当您使用cache_size编译指示更改缓存大小时 更改仅在当前会话中持续存在。缓存大小恢复 设置为关闭并重新打开数据库时的默认值。
默认页面缓存实现不分配 一次性获得全部缓存内存。缓存内存 根据需要以较小的块进行分配。page_cache 设置是内存量的建议上限 缓存可以使用而不是它将一直使用的内存量。 这是默认页面缓存实现的行为但应用程序定义的页面缓存是免费的 如果它愿意可以采取不同的行为。
普拉格玛cache_spill; PRAGMA cache_spill布尔值; PRAGMA 架构。cache_spillN;
cache_spill编译指示启用或禁用寻呼机的功能 将脏缓存页溢出到数据库文件的中间 交易。默认情况下Cache_spill处于启用状态大多数应用程序都处于启用状态 应该保持这种状态因为缓存溢出通常是有利的。 但是缓存溢出具有获取数据库文件的 EXCLUSIVE 锁的副作用。因此一些应用程序 具有大型长时间运行的事务可能希望禁用缓存溢出 为了防止应用程序获得独占锁 直到事务 COMMITs.
此编译指示的“PRAGMA cache_spillN”形式设置了最小值 发生溢出所需的缓存大小阈值。页数 缓存中必须同时超过cache_spill阈值和最大缓存 尺寸由 PRAGMA cache_size 声明设置以便溢出至 发生。
此编译指示的“PRAGMA cache_spillboolean”形式适用 跨连接到数据库连接的所有数据库。但是 本声明的“PRAGMA cache_spillN”形式仅适用于 “main”架构或任何其他架构被指定为 陈述。
PRAGMA case_sensitive_like 布尔值;
LIKE 运算符的默认行为是忽略大小写 用于 ASCII 字符。因此默认情况下“a”与“A”一样是 真。case_sensitive_like编译指示安装新的应用程序定义 区分大小写或不区分大小写的 LIKE 函数 关于case_sensitive_like编译指示的价值。 禁用case_sensitive_like时默认的 LIKE 行为为 表示。启用case_sensitive_like后大小写变为 重要。因此例如“a”和“A”一样是假的但“a”像“a”一样仍然是真的。
此编译指示使用 sqlite3_create_function 重载 LIKE 和 GLOB 函数它们可能会覆盖以前的实现 应用程序注册的 LIKE 和 GLOB。这个杂烩 仅更改 SQL LIKE 运算符的行为。它没有 更改 sqlite3_strlike C 语言接口的行为 这始终不区分大小写。
警告如果数据库在 架构例如在 CHECK 约束、表达式索引或部分索引的 WHERE 子句中则 使用此 PRAGMA 可以更改 LIKE 运算符的定义 导致数据库显示为已损坏。PRAGMA integrity_check 将报告错误。数据库并没有真正损坏 将 LIKE 的行为改回原样 这是定义架构并填充数据库的时候 将清除问题。如果 LIKE 的使用只发生在索引中 然后可以通过运行 REINDEX 来清除问题。不过 不鼓励使用case_sensitive_like编译指示。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
PRAGMA cell_size_check PRAGMA cell_size_check 布尔值;
cell_size_check编译指示启用或禁用额外的健全性 在最初从磁盘读取数据库 B 树页时检查它们。 启用单元大小检查后可以更早地检测到数据库损坏 并且不太可能“传播”。但是有一个小性能 点击进行额外的检查因此单元格大小检查被关闭 默认情况下。
PRAGMA checkpoint_fullfsync PRAGMA checkpoint_fullfsync 布尔值;
查询或更改检查点操作的 fullfsync 标志。 如果设置了此标志则使用F_FULLFSYNC同步方法 在支持F_FULLFSYNC的系统上的检查点操作期间。 checkpoint_fullfsync标志的默认值 已关闭。只有 Mac OS-X 支持F_FULLFSYNC。
如果设置了 fullfsync 标志则F_FULLFSYNC同步 方法用于所有同步操作并且 checkpoint_fullfsync 设置无关紧要。
普拉格玛collation_list;
返回为当前定义的排序规则序列的列表 数据库连接。
普拉格玛compile_options;
此编译指示返回以下情况下使用的编译时选项的名称 构建 SQLite每行一个选项。省略“SQLITE_”前缀 从返回的选项名称中。另请参阅 sqlite3_compileoption_get C/C 接口和 sqlite_compileoption_get SQL 函数。
普拉格玛count_changes; PRAGMA count_changes 布尔值;
查询或更改 count-changes 标志。通常当 未设置 count-changes 标志、INSERT、UPDATE 和 DELETE 语句 不返回任何数据。设置 count-changes 时每个命令 返回由一个整数值组成的单行数据 - 命令插入、修改或删除的行数。这 返回的更改计数不包括任何插入、修改 或触发器执行的删除自动进行的任何更改 通过外键操作或更新器引起的更新。
获取行更改计数的另一种方法是使用 sqlite3_changes 或 sqlite3_total_changes 接口。 不过有一个微妙的不同。当 INSERT、UPDATE 或 DELETE 使用 INSTEAD OF 触发器对视图运行 count_changes编译指示报告视图中的行数 触发触发器而 sqlite3_changes 和 sqlite3_total_changes 则没有。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
普拉格玛data_store_directory; PRAGMA data_store_directory 目录名称;
查询或更改全局sqlite3_data_directory值 变量Windows 操作系统接口后端使用它来 确定使用相对数据库指定的数据库文件的存储位置 路径。
更改data_store_directory设置是不安全的。 如果另一个线程切勿更改data_store_directory设置 在应用程序中同时运行任何SQLite接口。 这样做会导致未定义的行为。更改data_store_directory 设置写入sqlite3_data_directory全局 变量并且该全局变量不受互斥锁保护。
此功能是为没有操作系统的 WinRT 提供的 读取或更改当前工作目录的机制。 不鼓励在任何其他上下文中使用此编译指示并且可能 在将来的版本中不允许使用。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
PRAGMA 架构。data_version;
“PRAGMA data_version”命令指示 数据库文件已修改。 在内存中保存数据库内容的交互式程序 在屏幕上显示数据库内容可以使用 PRAGMA data_version 命令来确定他们是否需要刷新和重新加载内存 或更新屏幕显示。
由 2 返回的整数值 从同一连接调用“PRAGMA data_version” 如果将更改提交到数据库则情况会有所不同 通过过渡期间的任何其他连接。 对于所做的提交“PRAGMA data_version”值保持不变 在同一数据库连接上。 “PRAGMA data_version”的行为对于所有数据库都是相同的 连接包括单独进程中的数据库连接 和共享缓存数据库连接。
“PRAGMA data_version”值是每个 数据库连接以及两个并发调用返回的 SO 值 在单独的数据库连接上的“PRAGMA data_version”是 即使基础数据库相同也经常不同。 只有比较“PRAGMA data_version”值才有意义 由同一数据库连接在两个不同的点返回 时间。
普拉格玛database_list;
此编译指示的工作方式类似于查询为每个数据库返回一行 附加到当前数据库连接。 第二列是主数据库文件的“main”即“temp” 用于存储 TEMP 对象的数据库文件或 其他数据库文件的 ATTACHed 数据库。 第三列是数据库文件本身的名称或者为空 字符串如果数据库未与文件关联。
PRAGMA 架构。default_cache_size; PRAGMA 架构。default_cache_size 页数;
此编译指示查询或设置建议的最大页数 将按打开的数据库文件分配的磁盘缓存。 这个编译指示和cache_size的区别在于 此处设置的值在数据库连接之间保持不变。 默认缓存大小的值存储在 4 字节中 big-endian 整数位于 数据库文件。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
PRAGMA defer_foreign_keys PRAGMA defer_foreign_keys 布尔值;
当 PRAGMA defer_foreign_keys开启时 所有外键约束的强制执行被延迟到 最外层的事务已提交。defer_foreign_keys pragma 默认为 OFF因此仅在以下情况下延迟外键约束 它们被创建为“可延迟的初始延迟”。这 defer_foreign_keys编译指示在每个位置自动关闭 COMMIT 或 ROLLBACK。因此defer_foreign_keys编译指示必须是 为每笔交易单独启用。这个杂烩是 当然只有在启用外键约束时才有意义。
sqlite3_db_statusdbSQLITE_DBSTATUS_DEFERRED_FKS,... C语言接口可以在事务期间用于确定 如果存在延迟和未解析的外键约束。
普拉格玛empty_result_callbacks; PRAGMA empty_result_callbacks 布尔值;
查询或更改 empty-result-callbacks 标志。
empty-result-callbacks 标志仅影响 sqlite3_exec API。 通常当清除空结果回调标志时 提供给 sqlite3_exec 的回调函数不会被调用 对于返回零行数据的命令。当空结果回调时 在这种情况下设置回调函数正好调用一次 第三个参数设置为 0 NULL。这是为了启用程序 使用 sqlite3_exec API 检索列名即使 查询不返回任何数据。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
PRAGMA 编码; PRAGMA 编码 UTF-8; PRAGMA 编码 UTF-16; PRAGMA 编码 UTF-16le; PRAGMA 编码 UTF-16be;
在第一种形式中如果主数据库已经 created则此编译指示返回 主数据库UTF-8 UTF-16le little-endian UTF-16 encoding 或 UTF-16be big-endian UTF-16 encoding。如果主 数据库尚未创建则返回的值为 将用于创建主数据库的文本编码如果 它是由此会话创建的。
这种编译器的第二到第五种形式 设置创建主数据库时使用的编码 它是由此会话创建的。字符串“UTF-16”被解释 作为“使用本机字节排序的 UTF-16 编码”。事实并非如此 可以在数据库的文本编码之后更改数据库的文本编码 创建任何这样做的尝试都将被默默地忽略。
如果未首先使用此编译指示设置编码 然后是用于创建主数据库的编码 默认为由用于打开连接的 API 确定的 API。
为数据库设置编码后无法更改该编码。
由 ATTACH 命令创建的数据库始终使用相同的编码 作为主数据库。尝试使用不同的 ATTACH 数据库 来自“main”数据库的文本编码将失败。
PRAGMA 架构。foreign_key_check; PRAGMA 架构。foreign_key_check表名);
foreign_key_check编译指示检查数据库或表 称为“table-name”用于违反的外键约束。foreign_key_check pragma 为每个外键冲突返回一行输出。 每个结果行中有四列。 第一列是包含 REFERENCES 的表的名称 第。第二列是行的 rowid该行 包含无效的 REFERENCES 子句如果子表是 WITHOUT ROWID 表则为 NULL。第三列是名称 引用的表。第四列是 失败的特定外键约束。第四列 在foreign_key_check的输出中编译指示与 foreign_key_list Pragma 输出中的第一列。 指定“table-name”时唯一的外键约束 选中的是由 REFERENCES 子句创建的 table-name 的 CREATE TABLE 语句。
PRAGMA foreign_key_list表名);
此编译指示为 CREATE TABLE 语句中的 REFERENCES 子句创建的每个外键约束返回一行 表“table-name”。
普拉格玛foreign_keys; PRAGMA foreign_keys 布尔值;
查询、设置或清除外键约束的实施。
此编译指示是事务中的无操作;外键约束 只有在没有挂起的 BEGIN 或 SAVEPOINT 时才能启用或禁用强制执行。
更改foreign_keys设置会影响 所有发言稿都已准备好 使用数据库连接包括在 设置已更改。使用旧版 sqlite3_prepare 接口准备的任何现有语句都可能因SQLITE_SCHEMA错误而失败 更改foreign_keys设置后。
从 SQLite 版本 3.6.19 开始默认设置为 foreign 密钥强制执行为 OFF。但是这种情况在未来可能会改变 发布 SQLite。外键强制执行的默认设置 可以在编译时使用 SQLITE_DEFAULT_FOREIGN_KEYS 预处理器宏指定。为了尽量减少将来的问题应用程序应 根据应用程序的要求设置外键强制标志 并且不依赖于默认设置。
PRAGMA 架构。freelist_count;
返回数据库文件中未使用的页数。
普拉格玛full_column_names; PRAGMA full_column_names 布尔值;
查询或更改full_column_names标志。这面旗帜一起 用 short_column_names 标志确定 SQLite 为 SELECT 语句的结果列分配名称的方式。 结果列按顺序应用以下规则进行命名 如果结果上有 AS 子句则 该列是 AS 子句的右侧。 如果结果是一个通用表达式而不仅仅是 源表列 然后结果的名称是表达式文本的副本。 如果 short_column_names 编译指示为 ON则 result 是源表列的名称不带 源表名称前缀COLUMN。 如果编译指示 short_column_names 和 full_column_names 都关闭则情况 2 适用。 结果列的名称是源表的组合 和源列名称TABLE。列
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
PRAGMA fullfsync PRAGMA fullfsync 布尔值;
查询或更改 fullfsync 标志。此标志 确定是否使用F_FULLFSYNC同步方法 在支持它的系统上。fullfsync 标志的缺省值 已关闭。只有 Mac OS X 支持F_FULLFSYNC。
另见checkpoint_fullfsync。
普拉格玛function_list;
此编译指示返回 SQL 函数列表 数据库连接已知。结果的每一行 描述单个 SQL 函数的单个调用签名。 某些 SQL 函数在结果集中将具有多行 如果它们可以例如使用不同数量的 参数或可以接受各种编码的文本。
PRAGMA hard_heap_limit PRAGMA hard_heap_limitN
此编译指示调用 sqlite3_hard_heap_limit64 接口 参数 N如果指定了 N并且 N 是正整数 小于当前硬堆限制。 hard_heap_limit 编译指示始终返回相同的整数 这将由 sqlite3_hard_heap_limit64-1 C 语言返回 功能。也就是说它总是返回硬的值 在此 PRAGMA 施加的任何更改后设置的堆限制。
此编译指示只能降低堆限制而不能提高堆限制。 必须使用 C 语言接口 sqlite3_hard_heap_limit64 提高堆限制。
另请参阅soft_heap_limit编译指示。
PRAGMA ignore_check_constraints 布尔值;
此编译指示启用或禁用 CHECK 约束的强制执行。 默认设置为 off这意味着 CHECK 约束为 默认强制执行。
PRAGMA 架构。incremental_vacuumN; PRAGMA 架构。incremental_vacuum;
incremental_vacuum编译指示会导致多达 N 页 从自由列表中删除。数据库文件被截断 相同的数量。如果出现以下情况则incremental_vacuum编译指示不起作用 数据库未处于 auto_vacuumincremental 模式 或者如果免费列表中没有页面。如果自由列表上的页面少于 N 页或者 N 页小于 1或者 如果省略“N”参数则整个 自由列表被清除。
PRAGMA 架构。index_info索引名称);
此编译指示为命名索引中的每个键列返回一行。 键列是在 CREATE INDEX 索引语句或 UNIQUE 约束或 PRIMARY KEY 约束中实际命名的列该列 创建了索引。索引条目通常还包含辅助条目 指向要编制索引的表行的列。辅助 索引列不由index_info编译指示显示但它们是 由 index_xinfo Pragma 列出。
index_info编译指示的输出列如下所示
列在索引中的排名。0 表示最左边。要编制索引的表中列的排名。 值 -1 表示 rowid值 -2 表示正在使用表达式。要编制索引的列的名称。此列为 NULL 如果列是 rowid 或表达式。
如果没有名为 index-name 的索引但存在具有该名称的 WITHOUT ROWID 表则 SQLite 版本 3.30.0 on 2019-10-04 这个编译指示返回 WITHOUT ROWID 表的 PRIMARY KEY 列当它们被使用时 在底层 B 树的记录中也就是说 删除了重复的列。
PRAGMA 架构。index_list表名);
此编译指示为与 给定的表。
index_list编译指示的输出列如下所示
分配给每个索引的序列号用于内部跟踪 目的。索引的名称。如果索引为 UNIQUE则为“1”如果不是则为“0”。“c”如果索引是由 CREATE INDEX 语句创建的 “u”如果索引是由 UNIQUE 约束创建的或者 “pk”如果索引是由 PRIMARY KEY 约束创建的。如果索引是部分索引则为“1”如果不是“0”。
PRAGMA 架构。index_xinfo索引名称);
此编译指示返回有关索引中每一列的信息。 与此 index_info 编译指示不同此编译指示返回有关 索引中的每一列而不仅仅是键列。 键列是在 CREATE INDEX 索引语句或 UNIQUE 约束或 PRIMARY KEY 约束中实际命名的列该列 创建了索引。辅助列是需要的附加列 找到与每个索引条目对应的表条目。
index_xinfo 编译指示的输出列如下所示
列在索引中的排名。0 表示最左边。 关键列位于辅助列之前。要编制索引的表中列的排名如果为 -1则为 -1 index-column 是要编制索引的表的 rowid-2 如果索引位于表达式上。要编制索引的列的名称如果索引列为 NULL则为 NULL 是要编制索引的表的 rowid 或表达式。如果索引列按相反 DESC 顺序排序则为 1 index 和 0否则。用于比较索引列中的值的排序规则序列的名称。如果索引列是键列则为 1如果索引列为 0则为 0 是辅助列。
如果没有名为 index-name 的索引但存在具有该名称的 WITHOUT ROWID 表则 SQLite 版本 3.30.0 on 2019-10-04 这个编译指示返回 WITHOUT ROWID 表的列当它们被使用时 在底层 B 树的记录中也就是说 首先删除重复的 PRIMARY KEY 列然后是数据列。
PRAGMA 架构。integrity_check; PRAGMA 架构。integrity_checkN PRAGMA 模式。integrity_check表名)
此编译指示执行低级格式设置和一致性检查 数据库。integrity_check编译指示查找
不按顺序排列的表或索引条目格式错误的记录缺少页面缺少或多余的索引条目UNIQUE、CHECK 和 NOT NULL 约束错误自由列表的完整性数据库中多次使用或根本不使用的部分
如果integrity_check编译指示发现问题则返回字符串 作为多行每行一列描述 问题。在分析退出之前Pragma integrity_check 最多返回 N 个错误默认为 N 个 到 100。如果编译指示integrity_check未发现错误则 返回值为“ok”的单行。
通常的情况是检查整个数据库文件。然而 如果参数为 TABLENAME则仅对 命名的表及其关联的索引。 这称为“部分完整性检查”。因为只有 检查数据库错误例如文件的未使用部分或重复 无法检测到两个或多个表对文件的同一部分的使用。 自由列表仅在 部分完整性检查 TABLENAME 是否sqlite_schema或其之一 别名。添加了对部分完整性检查的支持 版本 3.33.0 2020-08-14。
PRAGMA integrity_check未发现 FOREIGN KEY 错误。 使用 PRAGMA foreign_key_check 命令查找 FOREIGN KEY 约束。
另请参阅 PRAGMA quick_check 命令该命令执行大部分 检查PRAGMA integrity_check但运行速度要快得多。
PRAGMA 架构。journal_mode; PRAGMA 架构。journal_mode 删除 |TRUNCATE 截断 |坚持 |内存 |瓦尔 |关闭
此编译指示查询或设置数据库的日志模式 与当前数据库连接关联。
此编译指示的第一种形式查询当前日记 数据库的模式。当省略数据库时 查询“main”数据库。
第二种形式更改了“数据库”的日记模式 或者如果省略了“database”则用于所有附加的数据库。 将返回新的日志模式。如果日志模式 无法更改则返回原始日志模式。
DELETE 日记模式是正常行为。在 DELETE 中 模式下回滚日志将在每次结束时删除 交易。事实上删除操作是导致 要提交的事务。 有关更多详细信息请参阅标题为“SQLite 中的原子提交”的文档。
TRUNCATE 日记模式通过截断来提交事务 将日志回滚为零长度而不是将其删除。在许多 系统截断文件比删除文件快得多因为 不需要更改包含目录。
PERSIST 日志模式可防止回滚日志 在每次事务结束时被删除。取而代之的是标头 的日志被零覆盖。这将防止其他 回滚日志的数据库连接。The PERSIST 日记模式在以下平台上用作优化 删除或截断文件比覆盖要昂贵得多 文件的第一个块带零。参见PRAGMA journal_size_limit 和 SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT。
MEMORY 日志模式将回滚日志存储在 易失性 RAM。这样可以节省磁盘 I/O但会以牺牲数据库为代价 安全与诚信。如果使用 SQLite 的应用程序在 设置 MEMORY 日志模式时事务的中间 那么数据库文件很可能会损坏。
WAL 日记模式使用预写日志而不是 回滚日志来实现事务。WAL 日记模式 是持久的;设置后它保持有效 跨多个数据库连接并在关闭和 重新打开数据库。WAL 日记模式下的数据库 只能通过 SQLite 版本 3.7.0 访问 2010-07-21 或更高版本。
OFF 日志模式将完全禁用回滚日志。 从未创建过回滚日志因此永远不会有回滚 要删除的日志。OFF 日志模式禁用原子 SQLite的提交和回滚功能。ROLLBACK 命令 不再有效;它以未定义的方式运行。申请必须 避免在日志模式关闭时使用 ROLLBACK 命令。 如果应用程序崩溃 在事务中间当 OFF 日记模式为 设置则数据库文件很可能会损坏。没有日记就没有办法 以下部分完成操作的声明 约束错误。这也可能使数据库处于损坏状态 州。例如如果重复的条目导致 CREATE UNIQUE INDEX 语句中途失败 它将留下一个部分创建的因此是损坏的索引。 因为关闭日记 模式允许使用普通 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_modepersist 运行则 提交事务后回滚日志文件可能会保留在 文件系统。这提高了后续事务的性能 由于覆盖现有文件比追加到文件更快 但它也消耗 文件系统空间。在进行大型交易例如真空之后 回滚日志文件可能会占用非常大的空间。
同样在 WAL 模式下预写日志文件不会被截断 遵循检查站。相反SQLite 重用现有文件 对于后续的 WAL 条目因为覆盖比追加更快。
journal_size_limit编译指示可用于限制 rollback-journal 和 WAL 文件剩余 在事务或检查点之后的文件系统中。 每次提交事务或重置 WAL 文件时SQLite 比较回滚日志文件或 WAL 文件的大小 文件系统达到大小限制 由此编译指示设置如果日志或 WAL 文件更大 它被截断到极限。
上面列出的编译指示的第二种形式用于设置新的限制 指定数据库的字节数。负数表示没有限制。 要始终将回滚日志和 WAL 文件截断到其最小大小 将journal_size_limit设置为零。 上面列出的编译指示的第一种和第二种形式都返回一个 包含单个整数列的结果行 - 日志的值 大小限制以字节为单位。默认日志大小限制为 -1无限制。可以使用SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT预处理器宏来更改 编译时的默认日志大小限制。
此编译指示仅在先前指定的单个数据库上运行 添加到编译指示名称如果未指定数据库则在“main”数据库上。 无法更改所有附加数据库的日志大小限制 使用单个 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 语句中的表名。对 表未修改包括
对触发器和视图正文中的表的引用。对原始 CHECK 约束中的表的引用 CREATE TABLE 语句。对部分索引的 WHERE 子句中的表的引用。
此编译指示的默认设置为 OFF这意味着所有 对架构中任意位置的表的引用将转换为新名称。
此编译指示是作为旧程序的解决方法提供的 包含预期不完整行为的代码 在旧版本的 SQLite 中找到的 ALTER TABLE RENAME。 新应用程序应将此标志保持关闭状态。
为了与较旧的虚拟表实现兼容 在运行 sqlite3_module.xRename 方法时此标志暂时打开。sqlite3_module.xRename 方法完成后将还原此标志的值。
也可以打开和关闭旧版 alter 表行为 使用 sqlite3_db_config 接口的 SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 选项。
旧版 alter 表行为是每个连接的设置。把 此功能的打开或关闭会影响数据库连接中的所有附加数据库文件。 该设置不会保留。在一个连接中更改此设置 不会影响任何其他连接。
普拉格玛legacy_file_format;
此编译指示不再起作用。它已经成为一个禁忌。 以前由 PRAGMA 提供的功能legacy_file_format 现在可以使用 sqlite3_db_config C 语言界面的 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 选项。
PRAGMA 架构。locking_mode; PRAGMA 架构。locking_mode 正常 |独家
此编译指示设置或查询数据库连接锁定模式。 锁定模式为 NORMAL 或 EXCLUSIVE。
在 NORMAL 锁定模式下默认值除非在编译时被覆盖 使用 SQLITE_DEFAULT_LOCKING_MODE数据库连接 在每次读取结束时解锁数据库文件 或 写入事务。当锁定模式设置为 EXCLUSIVE 时 数据库连接从不释放文件锁。第一次 以 EXCLUSIVE 模式读取数据库获取共享锁并 举行。第一次写入数据库时独占锁是 获得并持有。
在 EXCLUSIVE 模式下通过连接获取的数据库锁可能是 通过关闭数据库连接或将 使用此编译指示将锁定模式恢复为 NORMAL然后访问 数据库文件用于读取或写入。只需将锁定模式设置为 NORMAL 是不够的 - 锁要等到下次才会释放 将访问数据库文件。
将锁定模式设置为 EXCLUSIVE 有三个原因。
应用程序希望阻止其他进程 访问数据库文件。减少了对文件系统操作的系统调用次数 可能会导致性能小幅提升。可以在 EXCLUSIVE 模式下访问 WAL 数据库而无需 使用共享内存。 附加信息)
当 locking_mode 编译指示指定特定数据库时 例如 PRAGMA主。locking_mode排他性; 然后锁定模式仅适用于命名数据库。如果没有 数据库名称限定符位于“locking_mode”关键字之前然后 锁定模式应用于所有数据库包括任何新的数据库 由后续 ATTACH 命令添加的数据库。
“temp”数据库其中存储了 TEMP 表和索引 内存中数据库始终使用独占锁定模式。临时数据库和内存数据库的锁定模式不能 被改变。默认情况下所有其他数据库都使用正常锁定模式 并受到此编译指示的影响。
如果首次进入 WAL 日志模式时锁定模式为 EXCLUSEIVE则锁定模式无法更改为 正常直到退出 WAL 日志模式。 如果首次进入 WAL 时锁定模式为 NORMAL 日志模式则锁定模式可以在 NORMAL 和 EXCLUSIVE 并随时返回无需退出 WAL 日志模式。
PRAGMA 架构。max_page_count; PRAGMA 架构。max_page_count N;
查询或设置数据库文件中的最大页数。 编译指示的两种形式都返回最大页数。第二个 表单尝试修改最大页数。最大页数 计数不能减少到当前数据库大小以下。PRAGMA 架构。mmap_size; PRAGMA 架构。mmap_sizeN
查询或更改设置的最大字节数 除了单个数据库上的内存映射 I/O。第一种形式 不带参数查询当前限制。第二个 形式带有数值参数设置指定 数据库或者对于所有数据库如果可选数据库名称为 省略。在第二种形式中如果省略数据库名称则 设置的 limit 将成为所有数据库的默认限制 通过后续 ATTACH 语句添加到数据库连接中。
参数 N 是数据库文件的最大字节数 将使用内存映射的 I/O 进行访问。如果 N 为零则 内存映射 I/O 被禁用。如果 N 为负数则极限 还原为由最新 sqlite3_configSQLITE_CONFIG_MMAP_SIZE 确定的默认值或还原为编译 时间默认值由SQLITE_DEFAULT_MMAP_SIZE确定如果不是 已设置开始时间限制。
PRAGMA mmap_size 声明永远不会增加金额 用于内存映射 I/O 的地址空间 由 SQLITE_MAX_MMAP_SIZE 编译时选项设置的硬限制 也不是第二个参数在启动时设置的硬限制 sqlite3_configSQLITE_CONFIG_MMAP_SIZE)
内存映射 I/O 区域的大小在以下情况下无法更改 内存映射的 I/O 区域处于活动状态以避免取消映射 从正在运行的 SQL 语句中排出内存。出于这个原因 如果先mmap_size不为零则mmap_size编译指示可能是无操作 并且还有其他 SQL 语句在同一数据库连接上并发运行。
普拉格玛module_list;
此编译指示返回在数据库连接中注册的虚拟表模块的列表。
PRAGMA优化; PRAGMA优化MASK;PRAGMA 模式.optimize; PRAGMA schema.optimize掩码);
尝试优化数据库。所有架构都在 前两种形式在后者中仅优化指定的架构 二。
实现最佳的长期查询性能而无需 对应用程序模式和 SQL 进行详细的工程分析 建议应用程序运行“PRAGMA optimize”不带参数 就在关闭每个数据库连接之前。长时间运行的应用程序 设置一个计时器以每隔一次运行“PRAGMA optimize”也可能受益 几个小时。
这种编译通常是无操作的或几乎是这样并且非常快。 但是如果 SQLite 感觉 执行数据库优化例如运行 ANALYZE 或创建新索引将提高未来查询的性能然后 可以完成一些数据库 I/O。想要限制金额的应用程序 的工作可以设置一个计时器如果编译指示持续太久该计时器将调用 sqlite3_interrupt。 或者从 SQLite 3.32.0 开始应用程序可以使用 PRAGMA analysis_limitN 来做一些小的 N几百或几千的值来限制深度 的分析。
预计此编译指示执行的优化的详细信息 随着时间的推移而改变和改进。应用程序应预料到这一点 此编译指示将在将来的版本中执行新的优化。
可选的 MASK 参数是要执行的优化的位掩码 调试模式。实际上不执行任何优化 而是为每个优化返回一行文本 这本来可以做到的。默认情况下处于关闭状态。 对可能受益的表运行 ANALYZE。默认情况下处于打开状态。 有关其他信息请参阅下文。 尚未实施记录使用情况和性能 当前会话中的信息 数据库文件以便它可以“优化” 编译指示由将来的数据库连接运行。 尚未实施创建可能对最近的查询有帮助的索引。
默认的 MASK 是并且始终应0xfffe。0xfffe掩码意味着 执行上面列出的所有优化调试模式除外。如果是新的 将来会添加默认情况下应该关闭的优化这些 新的优化将被赋予 0x10000 或更大的掩码。
查看所有本来可以完成的优化而实际上 执行这些操作运行“PRAGMA optimize-1”。仅使用 ANALYZE 优化运行“PRAGMA optimize0x02”。
确定何时运行分析
在当前实现中当且仅当 以下所有情况都是正确的 设置了 MASK 位0x02。 查询计划器sqlite_stat1对一个 或 在生存期的某个时间点表的更多索引 当前连接。 表的一个或多个索引当前未分析或者表中的行数增加了 25 倍或更多 自上次运行 ANALYZE 以来。
分析表的规则可能会在 将来的版本。
PRAGMA 架构。page_count;
返回数据库文件中的总页数。
PRAGMA 架构。page_size; PRAGMA 架构。page_size 字节;
查询或设置数据库的页面大小。页面 大小必须是介于 512 和 65536含之间的 2 次方。
创建新数据库时SQLite 会将页面大小分配给 基于平台和文件系统的数据库。多年来 默认页面大小几乎总是 1024 字节但开始 使用 SQLite 版本 3.12.0 2016-03-29 默认页面大小增加到 4096。 对于大多数应用程序建议使用默认页面大小。
指定新的页面大小不会更改页面大小 马上。相反新的页面大小将被记住并被使用 在首次创建数据库时设置页面大小如果确实如此 发布page_size编译指示时尚不存在或者在 下一个在同一数据库连接上运行的 VACUUM 命令 而不在 WAL 模式下。
可以使用SQLITE_DEFAULT_PAGE_SIZE编译时选项 更改分配给新数据库的默认页面大小。
PRAGMA parser_trace 布尔值;
如果 SQLite 已使用SQLITE_DEBUG编译时进行编译 选项则可以使用parser_trace编译指示来打开跟踪 用于 SQLite 内部使用的 SQL 解析器。 此功能用于调试 SQLite 本身。
此编译指示旨在用于调试 SQLite 本身。它 仅当 SQLITE_DEBUG 编译时选项时可用 被使用。
普拉格玛pragma_list;
此编译指示返回 PRAGMA 命令列表 数据库连接已知。
普拉格玛query_only; PRAGMA query_only 布尔值;
query_only编译指示在以下情况下阻止数据库文件上的数据更改 启用。启用此编译指示后任何尝试 CREATE、DELETE、 DROP、INSERT 或 UPDATE 将导致SQLITE_READONLY错误。 但是该数据库不是真正的只读数据库。您仍然可以运行 检查点或 COMMIT 和 sqlite3_db_readonly 例程的返回值不受影响。
PRAGMA 架构。quick_check; PRAGMA 架构。quick_checkN PRAGMA 模式。quick_check表名)
编译指示类似于 integrity_check只是它不验证 UNIQUE 约束并且不验证 索引内容与表内容匹配。通过跳过 UNIQUE 和索引一致性检查quick_check能够运行得更快。 PRAGMA quick_check 在 ON 时间内运行而 PRAGMA integrity_check 需要 ONlogN 时间其中 N 是 数据库。否则这两个编译指示是相同的。
普拉格玛read_uncommitted; PRAGMA read_uncommitted 布尔值;
查询、设置或清除 READ UNCOMMITTED 隔离。默认隔离 SQLite 的级别是 SERIALIZABLE。任何进程或线程都可以选择 READ UNCOMMITTED 隔离但仍将使用 SERIALIZABLE 在共享公共页面和架构缓存的连接之间。 使用 sqlite3_enable_shared_cache API 启用缓存共享。 默认情况下缓存共享处于禁用状态。
有关其他信息请参阅 SQLite 共享缓存模式。
普拉格玛recursive_triggers; PRAGMA recursive_triggers 布尔值;
查询、设置或清除递归触发器功能。
更改recursive_triggers设置会影响 所有发言稿都已准备好 使用数据库连接包括在 设置已更改。使用旧版 sqlite3_prepare 接口准备的任何现有语句都可能因SQLITE_SCHEMA错误而失败 更改recursive_triggers设置后。
在 SQLite 版本 3.6.18 2009-09-11 之前 不支持递归触发器。 SQLite的行为总是像这个编译指示一样 设置为 OFF。 版本 3.6.18 中添加了对递归触发器的支持 但为了兼容性最初默认关闭。递归的 在SQLite的未来版本中触发器可能会默认打开。
触发器的递归深度具有硬上限由 SQLITE_MAX_TRIGGER_DEPTH编译时选项和运行时 由 sqlite3_limitdbSQLITE_LIMIT_TRIGGER_DEPTH,... 设置的限制。
普拉格玛reverse_unordered_selects; PRAGMA reverse_unordered_selects 布尔值;
启用后此 PRAGMA 会导致许多 SELECT 语句没有 一个 ORDER BY 子句以相反的顺序发出它们的结果 他们通常会。这可以帮助调试以下应用程序 对结果顺序做出无效的假设。 reverse_unordered_selects编译指示适用于大多数 SELECT 语句 但是查询规划器有时可能会选择一种算法该算法是 不容易反转在这种情况下输出将出现在相同的 无论reverse_unordered_selects设置如何都可以订购。
SQLite 表示没有 如果 SELECT 省略 ORDER BY则保证结果的顺序 第。即便如此结果的顺序也不会从 1 改变 运行到下一个许多应用程序错误地依赖于 在任意输出顺序上无论该顺序恰好是什么。然而 有时新版本的SQLite将包含优化器增强功能 这将导致查询的输出顺序没有 ORDER BY 子句 转移。当这种情况发生时依赖于某个 输出顺序可能会出现故障。通过运行应用程序多个 禁用和启用此编译指示的次数其中 应用程序对输出顺序做出错误的假设可以是 及早发现并修复减少问题 这可能是由于链接到不同版本的 SQLite 引起的。
PRAGMA 架构。schema_version; PRAGMA 架构。schema_version 整数 ;
编译指示将获得或设置schema_version 数据库标头中偏移量为 40 处的 schema-version 整数的值。
SQLite 在 架构更改。当每个 SQL 语句运行时架构版本为 选中以确保架构自 SQL 以来未更改 声明已准备就绪。 通过使用“PRAGMA schema_versionN”来颠覆这种机制 更改schema_version的值 可能会导致 SQL 语句使用过时的架构运行 这可能导致不正确的答案和/或数据库损坏。 阅读schema_version总是安全的但将 schema_version可能会导致问题。出于这个原因尝试 要更改 schema_version 的值是无声的无操作当 数据库连接。
警告滥用此编译指示可能会导致数据库损坏。
出于本编译指示的目的考虑使用 VACUUM 命令 架构更改因为 VACUUM 通常会更改“根页面” sqlite_schema表中条目的值。
另请参阅 application_id 编译指示 和 user_version 编译指示。
PRAGMA 架构。secure_delete; PRAGMA 架构。secure_delete 布尔值|快
查询或更改安全删除设置。当secure_delete是 开启SQLite 会用零覆盖已删除的内容。默认值 secure_delete 的设置由 SQLITE_SECURE_DELETE 编译时选项确定通常处于关闭状态。的偏移设置 secure_delete通过减少 CPU 周期数来提高性能 以及磁盘 I/O 的数量。 希望避免离开的应用程序 删除或更新内容后的取证跟踪应启用 在执行删除或更新之前secure_delete编译指示否则 删除或更新后运行 VACUUM。
secure_delete的“快速”设置大约在 2017-08-01 添加 是介于“开”和“关”之间的中间设置。 当secure_delete设置为“快速”时 SQLite只有在这样做时才会用零覆盖已删除的内容 不会增加 I/O 的数量。换句话说“快” 设置使用更多的 CPU 周期但不使用更多的 I/O。 这具有从 b 树页面中清除所有旧内容的效果 但在 freelist 页面上留下了取证痕迹。
当有附加的数据库和没有数据库时 在编译指示中指定则所有数据库都有其安全删除 设置已更改。 新附加数据库的安全删除设置是该设置 评估 ATTACH 命令时的主数据库。
当多个数据库连接共享同一缓存时将 一个数据库连接上的 secure-delete 标志会为他们更改它 都。
限度secure_delete编译指示仅导致删除的内容被清除 从普通桌子。如果虚拟表将内容存储在影子表中则从虚拟表中删除内容会这样做 不一定从影子表中删除取证痕迹。 特别是 FTS3 和 FTS5 虚拟表 与 SQLite 捆绑在一起可能会在其影子表中留下取证痕迹 即使启用了 secure_delete 编译指示。
普拉格玛short_column_names; PRAGMA short_column_names 布尔值;
查询或更改 short-column-names 标志。此标志影响 SQLite 命名 SELECT 语句返回的数据列的方式。 有关完整的详细信息请参阅full_column_names编译指示。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。
普拉格玛shrink_memory
此编译指示会导致调用它的数据库连接 通过调用 sqlite3_db_release_memory 来释放尽可能多的内存。
PRAGMA soft_heap_limit PRAGMA soft_heap_limitN
此编译指示调用 sqlite3_soft_heap_limit64 接口 参数 N如果指定了 N 并且是非负整数。 soft_heap_limit 编译指示始终返回相同的整数 这将由 sqlite3_soft_heap_limit64-1 C 语言返回 功能。
另请参阅hard_heap_limit pragma。
PRAGMA统计数据;
此编译指示返回有关表和 指标。返回的信息在测试期间用于帮助 验证查询计划器是否正常运行。格式 并且此编译指示的含义可能会从一个版本中发生变化 到下一个。由于其波动性行为和输出 此编译指示的格式是故意未记录的。
此编译指示的预期用途仅用于测试和验证 SQLite的。本编译指示如有更改恕不另行通知并且不会 推荐供应用程序使用。
PRAGMA 架构。同步; PRAGMA 架构。同步 0 |关闭 |1 |正常 |2 |完整 |3 |额外;
查询或更改“synchronous”标志的设置。 第一个查询窗体将返回同步设置作为 整数。第二种形式更改同步设置。 各种同步设置的含义如下
额外 3
EXTRA synchronous 类似于 FULL加上目录 包含回滚日记在取消链接后同步该日记 以 DELETE 模式提交事务。EXTRA提供额外的 如果提交紧随其后的是断电则耐久性。
完整 2
当同步为 FULL 2 时SQLite 数据库引擎将 使用 VFS 的 xSync 方法确保所有内容都是安全的 在继续之前写入磁盘表面。 这可确保操作系统崩溃或电源故障将 不会损坏数据库。 FULL 同步非常安全但速度也较慢。FULL 是 非 WAL 模式时最常用的同步设置。
普通 1
当 synchronous 为 NORMAL 1 时SQLite 数据库 引擎在最关键的时刻仍会同步但频率较低 比在 FULL 模式下。有一个非常小的尽管不是零机会 在错误的时间发生电源故障可能会损坏旧文件系统上 journal_modeDELETE 中的数据库。WAL 模式不会损坏synchronousNORMAL 并且可能 DELETE 模式在现代文件系统上也是安全的。WAL 模式始终保持一致 使用 synchronousNORMAL但 WAL 模式确实会失去持久性。事务 在 WAL 模式下提交 synchronousNORMAL 可能会回滚以下内容 断电或系统崩溃。事务在应用程序中是持久的 无论同步设置或日志模式如何都会崩溃。 synchronousNORMAL 设置是大多数应用程序的不错选择 在 WAL 模式下运行。
关闭 0
在同步关闭 0 的情况下SQLite 继续而不同步 一旦它将数据移交给操作系统。 如果运行SQLite的应用程序崩溃数据将是安全的但是 如果操作系统损坏数据库可能会损坏 在写入该数据之前崩溃或计算机断电 到磁盘表面。另一方面提交可以是 同步关闭时幅度更快。
在 WAL 模式下当同步为 NORMAL 1 时WAL 文件为 在每个检查点和数据库文件之前同步 在完成每个检查点和 WAL 文件后同步 当 WAL 文件在 检查点但在大多数事务期间不执行同步操作。 在 WAL 模式下使用 synchronousFULL 时另外 WAL 文件的同步操作在每次事务提交后进行。 每个事务之后的额外 WAL 同步有助于确保 在断电期间事务是持久的。交易是 无论是否与提供的额外同步一致 synchronousFULL。 如果持久性不是问题则 synchronousNORMAL 通常为 在 WAL 模式下都需要。
TEMP 架构始终具有 synchronousOFF因为 的 TEMP 是短暂的预计不会在停电后幸存下来。 尝试更改 TEMP 的同步设置是 默默地忽略了。
另请参阅 fullfsync 和 checkpoint_fullfsync 编译指示。
PRAGMA 架构。table_info表名);
此编译指示为每个普通列返回一行 在命名表中。 结果集中的列包括“name”其名称;“类型” 如果给定数据类型否则 ;“notnull”无论列是否 可以是 NULL;“dflt_value”列的默认值; 和“pk”对于不属于主键的列任为零 或主键中列的从 1 开始的索引。
“cid”一栏不应被理解为超过 “在当前结果集中排名”。
在table_info注释中命名的表也可以是视图。
此编译指示不显示有关生成的列或隐藏列的信息。使用 PRAGMA table_xinfo 获取更完整的列表 包含生成列和隐藏列的列。
普拉格玛table_list; PRAGMA 架构。table_list; PRAGMA table_list表名);
此编译指示返回有关架构中的表和视图的信息 每行输出一个表。table_list编译指示首次出现 在 SQLite 版本 3.37.0 2021-11-27 中。自最初发布以来 table_list编译指示返回的列包括下面列出的列。 SQLite 的未来版本可能会添加 输出。
schema显示表或视图的架构 例如“main”或“temp”。name表或视图的名称。type对象的类型 - “table”、“view”、 “shadow”用于影子表或“virtual”用于虚拟表。ncol表中的列数包括生成的列和隐藏列。wr如果表是 WITHOUT ROWID 表则为 1如果不是则为 0。strict如果表是 STRICT 表则为 1如果不是则为 0。在将来的版本中可能会添加其他列。
默认行为是显示所有架构中的所有表。如果架构名称出现在编译指示之前则只有其中的表 将显示一个架构。如果提供了 table-name 参数则 仅返回有关该表的信息。
PRAGMA 架构。table_xinfo表名);
此编译指示为命名表中的每列返回一行 包括生成的列和隐藏的列。 输出具有与 PRAGMA table_info plus 相同的列 一列“隐藏”其值表示普通列 0 动态或存储的生成列2 或 3 或虚拟表 1 中的隐藏列。其所针对的行 对于PRAGMA table_info省略的字段此字段为非零。
普拉格玛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编译指示可用于指定 指定 FILE 时包含临时文件的目录。更改temp_store设置时 所有现有的临时表、索引、触发器和视图都是 立即删除。
库编译时 C 预处理器符号SQLITE_TEMP_STORE可以覆盖此编译指示设置。 下表总结了 SQLITE_TEMP_STORE预处理器宏和 temp_store 编译指示 SQLITE_TEMP_STORE普拉格玛 temp_store用于 TEMP 表和索引的存储0任何文件10文件11文件12记忆20记忆21文件22记忆3任何记忆 普拉格玛temp_store_directory; PRAGMA temp_store_directory 目录名称;
查询或更改 sqlite3_temp_directory 全局的值 变量许多操作系统接口后端都使用它来 确定临时表和索引的存储位置。
更改temp_store_directory设置时所有现有的临时 数据库中的表、索引、触发器和查看器连接 发出的 pragma 将立即删除。在 练习temp_store_directory应在第一次之后立即设置 进程的数据库连接已打开。如果temp_store_directory 对于一个数据库连接进行更改而其他数据库连接则发生更改 在同一进程中打开则行为未定义且 可能是不可取的。
更改temp_store_directory设置是非线程安全的。 如果另一个线程切勿更改temp_store_directory设置 在应用程序中同时运行任何SQLite接口。 这样做会导致未定义的行为。更改temp_store_directory 设置写入sqlite3_temp_directory全局 变量并且该全局变量不受互斥锁保护。
值 directory-name 应括在单引号中。 若要将目录恢复为默认值请将 directory-name 设置为 一个空字符串例如PRAGMA temp_store_directory 。一 如果找不到或找不到 directory-name则会引发错误 写。
临时文件的默认目录取决于操作系统。一些 操作系统接口可以选择忽略此变量并将临时变量放在 与指定目录不同的其他目录中的文件 这里。从这个意义上说这种实用主义只是建议性的。
此编译指示已弃用并存在 仅用于向后兼容。新应用 应避免使用此编译指示。较旧的应用程序应停止使用 尽早使用此编译指示。可以省略此编译指示 当使用SQLITE_OMIT_DEPRECATED编译SQLite时从构建中。 PRAGMA螺纹; PRAGMA 线程数 N;
查询或更改 sqlite3_limitdbSQLITE_LIMIT_WORKER_THREADS,... 限制的值 当前数据库连接。此限制设置了上限 关于预准备语句的辅助线程数 允许启动以协助查询。默认限制为 0 除非使用 SQLITE_DEFAULT_WORKER_THREADS 编译时选项进行更改。当限制为零时这意味着没有 将启动辅助线程。
此编译指示是围绕 sqlite3_limitdbSQLITE_LIMIT_WORKER_THREADS,... 接口的精简包装器。 普拉格玛trusted_schema; PRAGMA trusted_schema 布尔值;
trusted_schema设置是每个连接的布尔值 确定 SQL 函数和虚拟表是否 未经安全审计的视图允许运行 触发器或架构的表达式例如 CHECK 约束、DEFAULT 子句、生成的列、表达式索引和/或部分索引。也可以使用 sqlite3_db_configdbSQLITE_DBCONFIG_TRUSTED_SCHEMA,... C 语言界面。
为了保持向后兼容性此设置是 默认情况下为 ON。关闭它有好处而且大多数 如果关闭应用程序将不受影响。出于这个原因 鼓励所有应用程序在每个 一旦打开该连接数据库连接。
-DSQLITE_TRUSTED_SCHEMA0 编译时选项将导致 此设置默认为 OFF。
PRAGMA 架构。user_version; PRAGMA 架构。user_version 整数 ;
user_version编译指示将获得或设置 数据库标头中偏移量为 60 处的 user-version 整数的值。user-version 是一个整数即 可供应用程序使用以他们想要的方式使用。SQLite的 不使用用户版本本身。
另请参阅 application_id 编译指示和schema_version编译指示。
PRAGMA vdbe_addoptrace 布尔值;
如果 SQLite 已使用SQLITE_DEBUG编译时进行编译 选项则可以使用vdbe_addoptrace编译指示来完成 VDBE 操作码在代码生成期间创建时显示。 此功能用于调试 SQLite 本身。有关详细信息请参阅 VDBE 文档 信息。
此编译指示旨在用于调试 SQLite 本身。它 仅当 SQLITE_DEBUG 编译时选项时可用 被使用。 PRAGMA vdbe_debug 布尔值;
如果 SQLite 已使用SQLITE_DEBUG编译时进行编译 选项则vdbe_debug pragma 是其他三个的简写 仅调试编译指示vdbe_addoptrace、vdbe_listing 和 vdbe_trace。 此功能用于调试 SQLite 本身。有关详细信息请参阅 VDBE 文档 信息。
此编译指示旨在用于调试 SQLite 本身。它 仅当 SQLITE_DEBUG 编译时选项时可用 被使用。 PRAGMA vdbe_listing 布尔值;
如果 SQLite 已使用SQLITE_DEBUG编译时进行编译 选项则可以使用vdbe_listing编译指示来导致一个完整的 要在标准输出中显示的虚拟机操作码列表 因为每个语句都被计算。 在列表打开的情况下打印程序的全部内容 就在开始执行之前。声明 在打印列表后正常执行。 此功能用于调试 SQLite 本身。有关详细信息请参阅 VDBE 文档 信息。
此编译指示旨在用于调试 SQLite 本身。它 仅当 SQLITE_DEBUG 编译时选项时可用 被使用。 PRAGMA vdbe_trace 布尔值;
如果 SQLite 已使用SQLITE_DEBUG编译时进行编译 选项则可以使用vdbe_trace编译指示来导致虚拟机 操作码在评估时打印在标准输出上。 此功能用于调试 SQLite。有关详细信息请参阅 VDBE 文档 信息。
此编译指示旨在用于调试 SQLite 本身。它 仅当 SQLITE_DEBUG 编译时选项时可用 被使用。 普拉格玛wal_autocheckpoint; PRAGMA wal_autocheckpointN;
此编译指示查询或设置预写日志自动检查点间隔。 启用预写日志通过journal_mode编译指示后检查点将在任何时候自动运行 预写日志的长度等于或超过 N 页。 将自动检查点大小设置为零或负值 关闭自动检查点。
这个编译指示是 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 等价于调用 sqlite3_wal_checkpoint() C 接口。
使用参数调用此编译指示等效于使用与参数对应的第 3 个参数调用 sqlite3_wal_checkpoint_v2() C 接口
被动
检查尽可能多的帧无需等待任何数据库 读者或作家完成。如果日志中的所有帧都同步数据库文件 被检查。此模式与调用 sqlite3_wal_checkpoint() C 接口相同。busy-handler 回调从不被调用 这种模式。
满
此模式阻止 调用 busy-handler 回调 直到没有 数据库编写器和所有读者都在从最新的数据库中读取 快照。然后它会检查日志文件中的所有帧并同步 数据库文件。FULL 阻止并发写入器 运行但读者可以继续。
重新启动
此模式的工作方式与 FULL 相同只是在之后添加了 检查它阻止的日志文件调用 busy-handler 回调 直到所有读取器都完成日志文件。这确保了 下一个要写入数据库文件的客户端将重新启动日志文件 从一开始。RESTART 阻止并发写入器 运行但允许读者继续。
截断
此模式的工作方式与 RESTART 相同使用 此外WAL 文件在成功时被截断为零字节 完成。
wal_checkpoint 编译指示返回一行其中包含三个 整数列。第一列通常为 0但将是 1 如果 RESTART 或 FULL 或 TRUNCATE 检查点被阻止完成 例如因为另一个线程或进程处于活动状态 使用数据库。换言之如果 对 sqlite3_wal_checkpoint_v2 的等效调用将返回 SQLITE_OK 或 1如果等效调用返回 SQLITE_BUSY。 第二列是已修改的页面数 写入预写日志文件。 第三列是预写日志文件中的页数 已成功移回数据库文件网址为 检查站的结论。 如果没有则第二列和第三列为 -1 预写日志例如如果在数据库上调用了此编译指示 非 WAL 模式的连接。 PRAGMA writable_schema 布尔值;PRAGMA writable_schema 复位
当此编译指示打开时SQLITE_DBCONFIG_DEFENSIVE标志 熄灭则sqlite_schema表 可以使用普通的 UPDATE、INSERT 和 DELETE 语句进行更改。如果参数为“RESET”则模式编写为 禁用如“PRAGMA writable_schemaOFF”此外 架构已重新加载。警告滥用此编译指示很容易导致 数据库文件损坏。