非常教程

Sqlite参考手册

PRAGMA Statements

Pragma statements supported by SQLite

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

  • 特定的杂注语句可能会被删除,而其他人可能会在未来的SQLite版本中添加。不保证向后兼容性。
  • 如果发布未知的附注,则不会生成错误消息。未知的编译指示简单地被忽略。这意味着如果在编译指示语句中存在拼写错误,库不会通知用户这一事实。
  • 一些编译指示在SQL编译阶段生效,而不是执行阶段。这意味着如果使用C语言sqlite3_prepare(),sqlite3_step(),sqlite3_finalize()API(或类似的封装器接口),则该编译指示可以在sqlite3_prepare()调用期间运行,而不是在sqlite3_step()调用期间作为普通SQL声明做。或者,编译器可能在sqlite3_step()期间运行,就像正常的SQL语句一样。是否在sqlite3_prepare()或sqlite3_step()期间运行编译指示取决于编译指示和SQLite的特定版本。
  • pragma命令特定于SQLite,与任何其他SQL数据库引擎都不兼容。

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

PRAGMA命令语法

pragma-stmt: 隐藏

Pragma statements supported by SQLite

pragma-value: 隐藏

Pragma statements supported by SQLite

signed-number: 展现

Pragma statements supported by SQLite

一个杂注可以采用零个或一个参数。参数可以在括号中,也可以用等号与附注名称分开。这两种语法产生相同的结果。在许多编译指示中,参数是一个布尔值。布尔值可以是下列之一:

1是真的

0没有错误关闭

关键字参数可以选择显示在引号中。(例如:'yes' [FALSE]。)一些编译指令将一个字符串文字作为它们的参数。当编译指令采用关键字参数时,它通常也会采用一个数字等值。例如,“0”和“否”的含义与“1”和“是”相同。查询设置的值时,许多编译指示将返回数字而不是关键字。

附注可以在附注名称前具有可选的模式名称。模式名称是ATTACH-ed数据库的名称,或者是主数据库和TEMP数据库的“主”或“临时”名称。如果省略了可选的模式名称,则假定为“main”。在一些编译指示中,模式名称是无意义的,并且简单地被忽略。在以下文档中,模式名称有意义的编译指示以“ 模式 ”前缀显示。

PRAGMA功能

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

例如,可以使用index_info附注读取有关索引中列的信息,如下所示:

PRAGMA index_info('idx52');

或者,可以使用以下内容阅读相同的内容:

SELECT * FROM pragma_index_info('idx52');

表值函数格式的优点是查询只能返回PRAGMA列的一个子集,可以包含WHERE子句,可以使用聚合函数,而表值函数可以只是一个数据源中的一个加入。例如,要获取模式中所有索引列的列表,可以查询:

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

补充笔记:

  • 表值函数仅适用于内置PRAGMA,不适用于使用SQLITE_FCNTL_PRAGMA文件控件定义的PRAGMA。
  • 表值函数仅适用于返回结果且没有副作用的PRAGMA。
  • 通过首先使用创建单独的模式,可以使用此功能来实现信息模式

重视 ':memory:' 作为'information_schema';

然后在该架构中创建使用表值PRAGMA函数实现官方信息架构表的VIEW。

  • 此功能是实验性的,可能会发生变化。如果PRAGMAs功能的表值函数被正式支持,其他文档将可用。
  • SQLite版本3.16.0(2017-01-02)中添加了PRAGMA功能的表值函数。以前版本的SQLite无法使用此功能。

PRAGMA列表

  • application_id
  • auto_vacuum
  • automatic_index
  • busy_timeout
  • cache_size
  • cache_spill
  • case_sensitive_like
  • cell_size_check
  • checkpoint_fullfsync
  • collation_list
  • compile_options
  • count_changes¹
  • data_store_directory¹
  • data_version
  • database_list
  • default_cache_size¹
  • defer_foreign_keys
  • empty_result_callbacks¹
  • encoding
  • foreign_key_check
  • foreign_key_list
  • foreign_keys
  • freelist_count
  • full_column_names¹
  • fullfsync
  • ignore_check_constraints
  • incremental_vacuum
  • index_info
  • index_list
  • index_xinfo
  • integrity_check
  • journal_mode
  • journal_size_limit
  • legacy_file_format
  • locking_mode
  • max_page_count
  • mmap_size
  • optimize
  • page_count
  • page_size
  • parser_trace²
  • query_only
  • quick_check
  • read_uncommitted
  • recursive_triggers
  • reverse_unordered_selects
  • schema_version³
  • secure_delete
  • short_column_names¹
  • shrink_memory
  • soft_heap_limit
  • stats³
  • synchronous
  • table_info
  • temp_store
  • temp_store_directory¹
  • threads
  • user_version
  • vdbe_addoptrace²
  • vdbe_debug²
  • vdbe_listing²
  • vdbe_trace²
  • wal_autocheckpoint
  • wal_checkpoint
  • writable_schema³

Notes:

  1. 名字是的Pragma 通过已弃用。不要使用它们。它们存在历史兼容性。

2. 这些编译指示用于调试SQLite,并且仅在使用SQLITE_DEBUG编译SQLite时可用。

  1. 这些编译指示用于测试SQLite,不推荐用于应用程序。

PRAGMAschema.application_id;

PRAGMA schema.application_id = integer ;

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

除非使用SQLITE_DEFAULT_AUTOVACUUM编译时选项,否则auto-vacuum的默认设置为0或“none”。“无”设置表示自动吸尘功能被禁用。当自动吸尘器被禁用并且数据从数据库中删除数据时,数据库文件的大小保持不变。未使用的数据库文件页面被添加到“freelist”中,并被重复用于后续插入。所以没有数据库文件空间丢失。但是,数据库文件不收缩。在这种模式下,VACUUM命令可用于重建整个数据库文件,从而回收未使用的磁盘空间。

当自动吸气模式为1或“满”时,freelist页面将移动到数据库文件的末尾,并且数据库文件将被截断以在每次事务提交时移除freelist页面。但是,请注意,自动真空仅截断文件中的freelist页面。Auto-vacuum不对数据库进行碎片整理,也不像VACUUM命令那样重新包装各个数据库页面。事实上,因为它在文件内部移动页面,自动真空实际上可以使碎片变得更糟。

只有在数据库存储了一些允许每个数据库页面被追溯到其引用者的附加信息时,自动抽真空才是可能的。因此,必须在创建任何表之前打开自动吸尘功能。在创建表之后,无法启用或禁用自动吸尘器。

当自动吸尘器的值为2或“增量”时,执行自动吸尘所需的附加信息将存储在数据库文件中,但每次提交时自动吸尘不会像auto_vacuum = full一样自动执行。在增量模式下,必须调用单独的incremental_vacuum编译指示以使自动真空发生。

数据库连接可以随时在完整和增量式自动清理模式之间更改。但是,仅当数据库是新的(尚未创建表)或运行VACUUM命令时才会发生从“无”更改为“全部”或“增量”的情况。要更改自动吸尘模式,首先使用auto_vacuum编译指示来设置新的所需模式,然后调用VACUUM命令重新整理整个数据库文件。从“完整”或“增量”更改回“无”始终需要在空数据库上运行VACUUM。

当不带参数调用auto_vacuum编译指示时,它将返回当前的auto_vacuum模式。

PRAGMA automatic_index;

PRAGMA automatic_index = boolean;

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

在版本3.7.17(2013-05-20)中默认启用自动索引,但在未来的SQLite版本中可能会更改。

PRAGMA busy_timeout;

PRAGMA busy_timeout = milliseconds;

查询或更改繁忙超时设置。此编译指示是sqlite3_busy_timeout()C语言接口的替代方法,它可作为用于语言绑定的编译指示使用,但不提供对sqlite3_busy_timeout()的直接访问。

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

PRAGMA schema.cache_size;

PRAGMA schema.cache_size = pages;

PRAGMA schema.cache_size = -kibibytes;

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

如果参数N为正数,则建议的高速缓存大小设置为N.如果参数N为负数,则调整高速缓存页面的数量以使用近似绝对(N×1024)字节的存储器。向后兼容性注意:具有负N的cache_size的行为在版本3.7.10(2012-01-16)之前有所不同。在3.7.9及更早版本中,高速缓存中的页数设置为N的绝对值。

当您使用cache_size编译指示更改高速缓存大小时,更改仅在当前会话中保留。数据库关闭并重新打开时,缓存大小恢复为默认值。

PRAGMA cache_spill;

PRAGMA cache_spill=boolean;

PRAGMA schema.cache_spill=N;

cache_spill编译指示启用或禁用寻呼机在事务处理过程中将脏缓存页溢出到数据库文件的能力。Cache_spill在默认情况下处于启用状态,大多数应用程序都应该这样做,因为缓存溢出通常是有利的。但是,缓存溢出具有在数据库文件上获取EXCLUSIVE锁的副作用。因此,一些具有大量长时间运行的事务的应用程序可能希望禁用缓存溢出,以防止应用程序在事务提交之前获取对数据库的排他锁定。

该附注的“PRAGMA cache_spill = N ”形式设置溢出发生所需的最小高速缓存大小阈值。缓存中的页数必须超过cache_spill阈值和PRAGMA cache_size语句设置的最大缓存大小,以便发生溢出。

该编译指示的“PRAGMA cache_spill = boolean ”形式适用于连接到数据库连接的所有数据库。但是此语句的“PRAGMA cache_spill = N ”形式仅适用于“主”模式或其他任何模式作为语句的一部分。

PRAGMA case_sensitive_like = boolean;

LIKE运算符的默认行为是忽略ASCII字符的大小写。因此,默认'a'LIKE'A'是真的。case_sensitive_like编译指示安装一个新的应用程序定义的LIKE函数,它根据case_sensitive_like编译指示的值而区分大小写或不敏感。当case_sensitive_like被禁用时,表示默认的LIKE行为。当启用case_sensitive_like时,情况变得重要。例如,'a'LIKE'A'是错误的,但'a'LIKE'a'仍然是正确的。

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

PRAGMA cell_size_check

PRAGMA cell_size_check = boolean;

cell_size_check编译指示启用或禁用数据库b-tree页面上额外的完整性检查,因为它们最初是从磁盘读取的。在启用单元大小检查的情况下,数据库损坏会被更早检测到,并且不太可能“传播”。但是,执行额外检查时性能会受到很小的影响,因此默认关闭单元大小检查。

PRAGMA checkpoint_fullfsync

PRAGMA checkpoint_fullfsync = boolean;

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

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

PRAGMA collation_list;

返回为当前数据库连接定义的比较序列列表。

PRAGMA compile_options;

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

PRAGMA count_changes;

PRAGMA count_changes = boolean;

查询或更改计数更改标志。通常,如果未设置count-changes标志,则INSERT,UPDATE和DELETE语句不会返回任何数据。当设置计数更改时,这些命令中的每一个都会返回一行数据,其中包含一个整数值 - 由命令插入,修改或删除的行数。返回的更改计数不包括由触发器执行的任何插入,修改或删除操作,也不包括由外键操作自动进行的任何更改。

另一种获取行更改计数的方法是使用sqlite3_changes()或sqlite3_total_changes()接口。虽然有一个微妙的不同。当使用INSTEAD OF触发器对视图运行INSERT,UPDATE或DELETE时,count_changes pragma报告视图中触发触发器的行数,而sqlite3_changes()和sqlite3_total_changes()则不会。

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

PRAGMA data_store_directory;

PRAGMA data_store_directory = 'directory-name';

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

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

该工具是为WinRT提供的,它没有用于读取或更改当前工作目录的OS机制。在任何其他情况下使用此附注是不鼓励的,并且在将来的版本中可能会被禁止。

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

PRAGMA schema.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;

该编译指示的工作方式类似于查询,以便为连接到当前数据库连接的每个数据库返回一行。第二列是主数据库文件的“主”,用于存储TEMP对象的数据库文件的“temp”或用于其他数据库文件的ATTACHed数据库的名称。第三列是数据库文件本身的名称,如果数据库未与文件关联,则为空字符串。

PRAGMA schema.default_cache_size;

PRAGMA schema.default_cache_size = Number-of-pages;

该编译指示查询或设置将为每个打开的数据库文件分配的磁盘缓存的建议最大页数。这个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编译指示会在每个COMMIT或ROLLBACK时自动关闭。因此,必须为每个事务分别启用defer_foreign_keys编译指示。当然,如果启用了外键约束,该编译指示才有意义。

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

PRAGMA empty_result_callbacks;

PRAGMA empty_result_callbacks = boolean;

查询或更改空结果回调标志。

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

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

PRAGMA encoding;

PRAGMA encoding = "UTF-8";

PRAGMA encoding = "UTF-16";

PRAGMA encoding = "UTF-16le";

PRAGMA encoding = "UTF-16be";

在第一种形式中,如果主数据库已经被创建,则该编译指示返回主数据库使用的文本编码,即“UTF-8”,“UTF-16le”(小端UTF-16编码)或“ UTF-16be“(big-endian UTF-16编码)。如果主数据库尚未创建,则返回的值是用于创建主数据库的文本编码(如果该数据库由此会话创建)。

这个编译指示的第二到第五个形式设置主数据库将被创建的编码,如果它是由该会话创建的话。字符串“UTF-16”被解释为“使用本地机器字节顺序的UTF-16编码”。创建数据库后,无法更改数据库的文本编码,并且任何试图这样做的尝试都将被忽略。

一旦为数据库设置了编码,它就不能被改变。

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

PRAGMA schema.foreign_key_check;

PRAGMA schema.foreign_key_check(table-name);

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

PRAGMA foreign_key_list(table-name);

此编译指示为表“ 表名 ” 的CREATE TABLE语句中的REFERENCES子句创建的每个外键约束返回一行。

PRAGMA foreign_keys;

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 schema.freelist_count;

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

PRAGMA full_column_names;

PRAGMA full_column_names = boolean;

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

  1. 如果结果中有AS子句,则列的名称是AS子句的右侧。

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

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

4. 如果编译short_column_names和full_column_names都是OFF,则应用(2)。

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

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

PRAGMA fullfsync

PRAGMA fullfsync = boolean;

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

See also checkpoint_fullfsync.

PRAGMA ignore_check_constraints = boolean;

该编译指示启用或禁用CHECK约束的强制执行。默认设置是关闭的,这意味着CHECK约束是默认强制执行的。

PRAGMA schema.incremental_vacuum(N);

PRAGMA schema.incremental_vacuum;

incremental_vacuum附注引起多达N个页面从freelist中移除。数据库文件被截断相同的数量。如果数据库不处于auto_vacuum =增量模式或freelist上没有页面,则incremental_vacuum编译指示不起作用。如果在freelist上少于N页,或者N小于1,或者省略了“(N)”参数,则整个freelist被清除。

PRAGMA schema.index_info(index-name);

该编译指示为指定索引中的每个键列返回一行。关键列是实际在CREATE INDEX索引语句或创建索引的UNIQUE约束或PRIMARY KEY约束中命名的列。索引条目通常还包含指向索引表格行的辅助列。辅助索引列不由index_info附注显示,但它们由index_xinfo附注列出。

index_info附注中的输出列如下所示:

  1. 索引内列的等级。(0表示最左边。)

2. 表格中列的索引排列。

3. 被索引的列的名称。

PRAGMA schema.index_list(table-name);

该编译指示为与给定表关联的每个索引返回一行。

index_list编译指示的输出列如下:

  1. 为了内部追踪目的而分配给每个索引的序列号。

2. 索引的名称。

3. 如果索引是UNIQUE则为“1”,否则为“0”。

4. 如果索引是由CREATE INDEX语句创建的,则为“c”,如果索引是由UNIQUE约束创建的,则为“u”,如果索引是由PRIMARY KEY约束创建的,则为“pk”。

5. 如果索引是部分索引则为“1”,否则为“0”。

PRAGMA schema.index_xinfo(index-name);

该编译指示返回有关索引中每列的信息。与此index_info编译指示不同,此编译指示返回有关索引中每个列的信息,而不仅仅是关键列。(关键字列是在CREATE INDEX索引语句中实际命名的列或创建索引的UNIQUE约束或PRIMARY KEY约束。辅助列是定位与每个索引条目对应的表条目所需的附加列。)

index_xinfo编译指示的输出列如下所示:

1. 索引内列的等级。(0表示最左边,关键列位于辅助列之前。)

2. 索引表中的列的排名,如果索引列是要索引的表的rowid,则为-1。

3. 被索引的列的名称,如果索引列是被索引的表的rowid,则为NULL。

4. 1如果索引列按索引以反向(DESC)顺序排序,否则为0。

5. 整理序列的名称,用于比较索引列中的值。

6. 如果索引列是键列,则为1;如果索引列是辅助列,则为0。

PRAGMA schema.integrity_check;

PRAGMA schema.integrity_check(N)

该编译指示对整个数据库进行完整性检查。integrity_check编译指示查找无序记录,缺少页面,格式错误的记录,缺少索引条目以及UNIQUE,CHECK和NOT NULL约束错误。如果integrity_check编译指示发现问题,则返回描述问题的字符串(作为具有每行的单个列的多行)。Pragma integrity_check将在分析退出前返回至多N个错误,N默认为100.如果pragma integrity_check未发现错误,则返回值为'ok'的单个行。

PRAGMA integrity_check没有找到FOREIGN KEY错误。使用PRAGMA foreign_key_check命令查找FOREIGN KEY约束中的错误。

另请参阅PRAGMA quick_check命令,它执行大多数PRAGMA integrity_check检查,但运行速度更快。

PRAGMA schema.journal_mode;

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

该编译指示查询或设置与当前数据库连接关联的数据库的日志模式。

该编译指示的第一种形式查询数据库的当前日志模式。当数据库被省略,“主”查询数据库。

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

DELETE日记模式是正常行为。在DELETE模式下,回滚日志在每个事务结束时被删除。事实上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为“Atomic Commit In 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命令不再起作用; 它的行为不确定。日志模式为OFF时,应用程序必须避免使用ROLLBACK命令。如果应用程序在OFF日志模式设置时在事务中间崩溃,那么数据库文件很可能会损坏。

请注意,内存数据库的journal_mode是MEMORY或OFF,不能更改为不同的值。尝试将内存数据库的journal_mode更改为除MEMORY或OFF之外的任何设置都将被忽略。还要注意,事务处于活动状态时,journal_mode无法更改。

PRAGMA schema.journal_size_limit

PRAGMA schema.journal_size_limit = N ;

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

同样,在WAL模式下,预写日志文件在检查点之后不会被截断。相反,SQLite会重复使用现有的文件以用于后续的WAL条目,因为覆盖速度快于追加速度。

journal_size_limit编译指示可用于限制事务或检查点之后留在文件系统中的回滚日志和WAL文件的大小。每次提交事务或WAL文件重置时,SQLite会将留在文件系统中的回滚日志文件或WAL文件的大小与此编译指示所设置的大小限制进行比较,并且如果日志或WAL文件较大,则它将被截断达到极限。

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

此编译指示仅对在编译指示名称之前指定的单个数据库进行操作(如果未指定数据库,则在“主”数据库上执行)。无法使用单个PRAGMA语句更改所有连接数据库的日志大小限制。每个附加数据库必须分别设置大小限制。

PRAGMA legacy_file_format;

PRAGMA legacy_file_format = boolean

该编译指示设置或查询legacy_file_format标志的值。打开此标志时,将以文件格式创建新的SQLite数据库,该文件格式可由所有版本的SQLite恢复到3.0.0进行读写。当标志关闭时,将使用最新的文件格式创建新的数据库,该文件格式可能在3.3.0之前版本的SQLite中不可读或可写。

当legacy_file_format编译指示被发送时没有参数时,它将返回该标志的设置。该编译指示不会告诉当前数据库使用哪种文件格式; 它会告诉任何新创建的数据库将使用哪种格式。

当第一次打开新文件格式的现有数据库时,legacy_file_format编译指示被初始化为OFF。

默认文件格式由SQLITE_DEFAULT_FILE_FORMAT编译时选项设置。

PRAGMA schema.locking_mode;

PRAGMA schema.locking_mode = NORMAL | EXCLUSIVE

该编译指示设置或查询数据库连接锁定模式。锁定模式是NORMAL或EXCLUSIVE。

在NORMAL锁定模式下(默认情况除非在编译时使用SQLITE_DEFAULT_LOCKING_MODE重写),数据库连接在每次读取或写入事务结束时解锁数据库文件。当锁定模式设置为EXCLUSIVE时,数据库连接从不释放文件锁定。数据库首次以独占模式读取时,将获得并保存共享锁。数据库第一次写入时,会获得并保存排它锁。

通过关闭数据库连接,或通过使用此附注将锁定模式设置回NORMAL,然后访问数据库文件(用于读取或写入),可以释放通过EXCLUSIVE模式中的连接获取的数据库锁定。只需将锁定模式设置为NORMAL即可 - 只有在下次访问数据库文件时才会释放锁定。

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

  1. 应用程序想阻止其他进程访问数据库文件。

2. 文件系统操作的系统调用次数减少,可能会导致性能提高很小。

3. WAL数据库可以在不使用共享内存的情况下以独占模式访问。(附加信息)

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

 PRAGMA main.locking_mode=EXCLUSIVE; 

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

“临时”数据库(其中存储了TEMP表和索引)和内存数据库始终使用独占锁定模式。临时和内存数据库的锁定模式不能更改。所有其他数据库默认使用正常锁定模式,并受此编译指示影响。

如果首次进入WAL日志模式时锁定模式为EXCLUSIVE,则在退出WAL日志模式之前,锁定模式不能更改为NORMAL。如果第一次进入WAL日志模式时锁定模式为NORMAL,则可以在NORMAL和EXCLUSIVE之间随时更改锁定模式,并且无需退出WAL日志模式。

PRAGMA schema.max_page_count;

PRAGMA schema.max_page_count = N;

查询或设置数据库文件中的最大页数。这两种形式的编译指示返回最大页数。第二种形式试图修改最大页数。最大页数不能减少到当前数据库大小以下。

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的第二个参数的硬限制集start-time(SQLITE_CONFIG_MMAP_SIZE)

内存映射I / O区域的大小在内存映射I / O区域处于活动状态时无法更改,以避免在运行SQL语句下取消映射内存。因此,如果先前的mmap_size非零,并且在同一数据库连接上还有其他SQL语句同时运行,则mmap_size编译指示可能无效。

PRAGMA optimize;

PRAGMA optimize(MASK);

PRAGMA schema.optimize;

PRAGMA schema.optimize(MASK);

尝试优化数据库。所有模式都在前两种形式中进行了优化,只有指定的模式在后两种模式中进行了优化。

为了在不需要对应用程序模式和SQL进行详细工程分析的情况下实现最佳的长期查询性能,建议应用程序在关闭每个数据库连接之前运行“PRAGMA optimize”(无参数)。长时间运行的应用程序也可能受益于设置计时器以每隔几个小时运行“PRAGMA优化”。

这个编译指令通常是没有任何操作或几乎如此,速度非常快。但是,如果SQLite认为执行数据库优化(例如运行ANALYZE或创建新索引)可以提高未来查询的性能,那么可以完成一些数据库I / O。想要限制执行的工作量的应用程序可以设置一个计时器,如果编译过程持续太久,该计时器将调用sqlite3_interrupt()。

预计该编译指示所执行的优化细节预计会随着时间的推移而改变和改进。应用程序应该预计此编译指示将在未来的版本中执行新的优化。

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

  1. 调试模式。实际上不要执行任何优化,而是会为每次优化返回一行文本。默认关闭。
  1. 在可能受益的表上运行ANALYZE。默认开启。请参阅下面的其他信息。
  1. (尚未实施)在数据库文件中记录当前会话的使用情况和性能信息,以便可以“优化”未来数据库连接运行的杂注。
  1. (尚未实现)创建可能对最近查询有帮助的索引。

默认的MASK总是为0xfffe。0xfffe掩码表示除调试模式外,执行上面列出的所有优化。如果未来添加的新优化默认关闭,那么这些新优化将被赋予0x10000或更大的掩码。

要查看所有在没有实际执行的情况下完成的优化,请运行“PRAGMA optimize(-1)”。要仅使用ANALYZE优化,请运行“PRAGMA optimize(0x02)”。

何时进行分析的确定

在当前的实现中,当且仅当以下全部为真时分析表格:

  • MASK bit 0x02 is set.
  • 查询计划程序在当前连接的生命周期的某个点使用sqlite_stat1样式的统计信息来获取表的一个或多个索引。
  • 自上次运行ANALYZE以来,表中的一个或多个索引当前未分析,表中的行数增加了25倍或更多。

在未来的版本中,表格分析的规则可能会发生变化。

PRAGMA schema.page_count;

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

PRAGMA schema.page_size;

PRAGMA schema.page_size = bytes;

查询或设置数据库的页面大小。页面大小必须是512和65536之间的两个幂。

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

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

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

PRAGMA parser_trace = boolean;

如果SQLite已使用SQLITE_DEBUG编译时选项进行编译,那么parser_trace编译指示可用于打开SQLite内部使用的SQL解析器的跟踪。此功能用于调试SQLite本身。

这个编译指示是用于调试SQLite本身的。它仅在使用SQLITE_DEBUG编译时选项时可用。

PRAGMA query_only;

PRAGMA query_only = boolean;

query_only pragma在启用时阻止对数据库文件的所有更改。

PRAGMA schema.quick_check;

PRAGMA schema.quick_check(N)

该编译指示与integrity_check相似,只是它不验证UNIQUE约束,并且不验证索引内容是否与表内容匹配。通过跳过UNIQUE和索引一致性检查,quick_check能够比integrity_check运行得更快。否则,这两个编译指示是相同的。

PRAGMA read_uncommitted;

PRAGMA read_uncommitted = boolean;

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

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

PRAGMA recursive_triggers;

PRAGMA recursive_triggers = boolean;

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

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

在SQLite 版本3.6.18(2009-09-11)之前,不支持递归触发器。SQLite的行为总是好像这个编译指示被设置为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子句的查询的输出顺序发生变化。发生这种情况时,依赖于某个输出顺序的应用程序可能会发生故障。通过多次运行应用程序并使用此编译指示禁用和启用,可以及早识别和修复应用程序对输出顺序进行错误假设的情况,从而减少可能由于链接到不同版本的SQLite而导致的问题。

PRAGMA schema.schema_version;

PRAGMA schema.schema_version = integer ;

schema_version编译指示将获取或设置数据库头中偏移量为40的模式版本整数的值。

只要模式更改,SQLite就会自动增加模式版本。随着每个SQL语句的运行,将检查模式版本,以确保自从SQL语句准备好以后模式没有发生变化。通过使用“PRAGMA schema_version”来颠覆此机制可能导致SQL语句使用过时的模式运行,这会导致错误的答案和/或数据库损坏。

警告:误用这个编译指示会导致数据库损坏。

出于此编译指示的目的,VACUUM命令被视为模式更改,因为VACUUM通常会更改sqlite_master表中条目的“根页面”值。

另请参阅application_id编译指示和user_version编译指示。

PRAGMA schema.secure_delete;

PRAGMA schema.secure_delete = boolean|FAST

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

secure_delete的“快速”设置(大约2017-08-01增加)是“开”和“关”之间的中间设置。当secure_delete设置为“fast”时,只有在不增加I / O数量的情况下,SQLite才会用零覆盖已删除的内容。换句话说,“快速”设置使用更多的CPU周期,但不使用更多的I / O。这会清除b树页面中的所有旧内容,但会在freelist页面上留下法庭痕迹。

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

当多个数据库连接共享同一个缓存时,更改一个数据库连接上的安全 - 删除标志会改变它们。

PRAGMA short_column_names;

PRAGMA short_column_names = boolean;

查询或更改短列名称标志。该标志影响SQLite命名SELECT语句返回的数据列的方式。有关完整的详细信息,请参阅full_column_names编译指示。

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

PRAGMA shrink_memory

通过调用sqlite3_db_release_memory(),此编译指示可使调用它的数据库连接释放尽可能多的内存。

PRAGMA soft_heap_limit

PRAGMA soft_heap_limit=N

如果指定N并且是非负整数,则此编译指示调用带有参数N的sqlite3_soft_heap_limit64()接口。soft_heap_limit pragma总是返回sqlite3_soft_heap_limit64(-1)C语言函数返回的相同整数。

PRAGMA stats;

该编译指示返回有关表和索引的辅助信息。返回的信息在测试过程中用于帮助验证查询计划程序是否正常运行。这个编译指示的格式和含义很可能会从一个版本发布到另一个版本。由于其波动性,该编译指示的行为和输出格式故意没有记录。

此编译指示的用途仅用于测试和验证SQLite。此编译指南如有更改,恕不另行通知,不建议由应用程序使用。

PRAGMA schema.synchronous;

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

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

EXTRA(3)EXTRA同步就像FULL一样,除了在该日志未链接以在DELETE模式下提交事务之后,包含回滚日志的目录同步之外。如果提交紧跟在断电之后,则额外提供额外的耐久性。FULL(2)当同步为FULL(2)时,SQLite数据库引擎将使用VFS的xSync方法来确保在继续之前将所有内容安全地写入磁盘表面。这可确保操作系统崩溃或电源故障不会损坏数据库。完全同步非常安全,但速度也较慢。FULL是不在WAL模式下最常用的同步设置。正常(1)当同步是NORMAL(1)时,SQLite数据库引擎仍然会在最关键的时刻同步,但比在FULL模式下更少。在正常模式下,错误时间的电源故障可能会损坏数据库的机会非常小(但非零)。但在实践中,您更可能遭受灾难性磁盘故障或其他不可恢复的硬件故障。许多应用程序在WAL模式下选择NORMAL。关闭(0)在同步OFF(0)的情况下,只要SQLite将数据交给操作系统,SQLite就不会同步。如果运行SQLite的应用程序崩溃,则数据将是安全的,但如果在数据写入磁盘表面之前操作系统崩溃或计算机断电,数据库可能会损坏。另一方面,在同步关闭的情况下,提交可以快几个数量级。

在WAL模式下,当同步为NORMAL(1)时,WAL文件在每个检查点之前同步,并且在每个完成的检查点之后同步数据库文件,并且在检查点之后开始重用WAL文件时同步WAL文件头同步操作在大多数事务中发生。在WAL模式下同步= FULL时,每次事务提交后都会发生WAL文件的附加同步操作。每次交易后的额外WAL同步有助于确保交易在整个电力损失期间持续运行。事务符合或不符合synchronous = FULL提供的额外同步。如果耐久性不是问题,那么在WAL模式下通常都需要同步= NORMAL。

默认设置通常是同步= FULL。SQLITE_EXTRA_DURABLE编译时选项将默认值更改为synchronous = EXTRA。

TEMP模式总是具有同步= OFF,因为TEMP的内容是短暂的,并且预计在停电时不会存在。尝试更改TEMP的同步设置将被忽略。

另请参阅fullfsync和checkpoint_fullfsync编译指示。

PRAGMA schema.table_info(table-name);

此编译指示为指定表中的每列返回一行。结果集中的列包括列名称,数据类型,列是否可以为NULL以及列的默认值。结果集中的“pk”列对于不是主键一部分的列是零,并且是作为主键一部分的列的主键列中的索引。

在table_info附注中命名的表也可以是一个视图。

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 Storage used for TEMP tables and indices 0 any file 1 0 file 1 1 file 1 2 memory 2 0 memory 2 1 file 2 2 memory 3 any memory

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全局变量,并且该全局变量不受互斥锁的保护。

目录名应该用单引号引起来。要将目录恢复为默认值,请将目录名称设置为空字符串,例如,PRAGMA temp_store_directory =''。如果找不到目录名或不可写,则会发生错误。

临时文件的默认目录取决于操作系统。某些操作系统接口可能会选择忽略此变量,并将临时文件放置在与此处指定的目录不同的其他目录中。从这个意义上说,这个附注只是咨询。

这个编译指示不推荐使用,只是为了向后兼容而存在。新的应用程序应该避免使用这个附注。较早的应用程序应尽早停止使用此附注。当使用SQLITE_OMIT_DEPRECATED编译SQLite时,可能会从编译中删除该编译指示。

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 schema.user_version;

PRAGMA schema.user_version = integer ;

user_version编译指示将获取或设置数据库标题中偏移量为60的用户版本整数的值。用户版本是一个整数,可供应用程序使用,但他们需要。SQLite不使用用户版本本身。

另请参阅application_id编译指示和schema_version编译指示。

PRAGMA vdbe_addoptrace = boolean;

如果使用SQLITE_DEBUG编译时选项编译SQLite,则可以使用vdbe_addoptrace编译指示使代码生成过程中创建完整的VDBE操作码。此功能用于调试SQLite本身。有关更多信息,请参阅VDBE文档。

这个编译指示是用于调试SQLite本身的。它仅在使用SQLITE_DEBUG编译时选项时可用。

PRAGMA vdbe_debug = boolean;

如果使用SQLITE_DEBUG编译时选项编译SQLite,则vdbe_debug编译指示是其他三个仅用于调试的编译指示的简写: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_DEBUG编译时选项编译SQLite,则可以使用vdbe_trace编译指示将虚拟机操作码打印到标准输出中,以供评估。该功能用于调试SQLite。有关更多信息,请参阅VDBE文档。

这个编译指示是用于调试SQLite本身的。它仅在使用SQLITE_DEBUG编译时选项时可用。

PRAGMA wal_autocheckpoint;

PRAGMA wal_autocheckpoint=N;

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

这个编译指示是一个围绕sqlite3_wal_autocheckpoint()C接口的包装。所有自动检查点都是被动的。

Autocheckpointing is enabled by default with an interval of 1000 or SQLITE_DEFAULT_WAL_AUTOCHECKPOINT.

PRAGMA schema.wal_checkpoint;

PRAGMA schema.wal_checkpoint(PASSIVE);

PRAGMA schema.wal_checkpoint(FULL);

PRAGMA schema.wal_checkpoint(RESTART);

PRAGMA schema.wal_checkpoint(TRUNCATE);

如果启用预写日志(通过journal_mode杂注),则此编译指示会导致检查点操作在数据库数据库上运行,或在所有连接的数据库上运行(如果省略了数据库)。如果预写日志模式被禁用,则该编译指示是无害操作。

不带参数调用此编译指示与调用sqlite3_wal_checkpoint()C接口相当。

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

wal_checkpoint编译指示返回具有三个整数列的单个行。第一列通常是0,但如果RESTART或FULL或TRUNCATE检查点被阻止完成,例如因为另一个线程或进程正在使用数据库,则该列将为1。换句话说,如果对sqlite3_wal_checkpoint_v2()的等效调用返回SQLITE_OK,则第一列为0,如果等效调用返回SQLITE_BUSY,则第一列为0。第二列是已写入预写日志文件的已修改页面的数量。第三列是在预检日志文件中在检查点结束时已成功移回数据库文件中的页数。如果没有预写日志,则第二列和第三列为-1,

PRAGMA writable_schema = boolean;

打开此编译指示时,可使用普通的UPDATE,INSERT和DELETE语句更改数据库的SQLITE_MASTER表。警告:滥用此附注可能会导致数据库文件损坏。

 SQLite is in the Public Domain.

PRAGMA Statements相关

Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By