小. 快速. 可靠.
选择任意三个.

PRAGMA声明

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

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


PRAGMA命令语法

pragma-stmt:

语法图pragma-stmt

语用价值:

语法图pragma-value

有符号数:

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

1是正确于
0没有假关闭

关键字参数可以选择用引号引起来. (例如: 'yes'[FALSE] .)某些编译指示将字符串文字作为其自变量. 当编译指示采用关键字参数时,通常也将采用数值等效项. 例如," 0"和"否"与" 1"和"是"含义相同. 查询设置的值时,许多编译指示会返回数字而不是关键字.

编译指示可以在编译指示名称之前具有可选的架构名称. schema-nameATTACH编辑的数据库的名称,或者是main和TEMP数据库的" main"或" temp"名称. 如果省略了可选的架构名称,则假定为" main". 在某些语用上,模式名称是没有意义的,只是被忽略. " prefix. 在下面的文档中,模式名称有意义的编译指示以" "前缀显示.


PRAGMA功能

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

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

  PRAGMA index_info('idx52');

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

  选择* FROM pragma_index_info('idx52');

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

  SELECT DISTINCT m.name ||  '.'  ||  ii.AS为"索引列"
   从sqlite_master AS m,
        pragma_index_list(m.name)如il,
        pragma_index_info(il.name)AS ii
  在哪里m.type ='table'
  ORDER BY 1;

补充说明:


PRAGMA列表

笔记:

  1. 编译指示他们的名字通过已被弃用的袭击 . 不要使用它们. 存在它们是为了历史兼容性.
  2. 这些编译指示仅在使用非标准编译时选项的构建中可用.
  3. 这些编译指示用于测试SQLite,不建议在应用程序中使用.

PRAGMA application_id

PRAGMA application_id;
PRAGMA ; application_id = ;

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

另请参阅user_version编译指示 . PRAGMA auto_vacuum


PRAGMA auto_vacuum;
PRAGMA auto_vacuum = ; ;

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

除非使用SQLITE_DEFAULT_AUTOVACUUM编译时选项,否则自动真空的默认设置为0或"无". "无"设置表示禁用自动真空. 禁用自动真空并且从数据库中删除数据后,数据库文件将保持相同大小. 未使用的数据库文件页面被添加到" freelist "中,并用于后续插入. 因此,不会丢失数据库文件空间. 但是,数据库文件不会收缩. 在这种模式下, VACUUM命令可用于重建整个数据库文件,从而回收未使用的磁盘空间.

当自动真空模式为1或"完全"时,将空闲列表页面移至数据库文件的末尾,并且在每次事务提交时,数据库文件将被截断以删除空闲列表页面. 但是请注意,自动清空只会截断文件中的空闲列表页面. 自动真空不会像VACUUM命令那样对数据库进行碎片整理或重新打包单个数据库页面. 实际上,由于自动抽真空会在文件内移动页面,因此实际上会使碎片变得更糟.

只有在数据库存储一些附加信息时,才可以进行自动抽真空,这些附加信息允许将每个数据库页面追溯到其引用程序. 因此,在创建任何表之前必须打开自动真空. 创建表后,无法启用或禁用自动真空.

当auto-vacuum的值为2或" incremental"时,执行自动真空处理所需的其他信息存储在数据库文件中,但是自动提交不会像auto_vacuum = full那样在每次提交时自动发生. 在增量模式下,必须调用单独的增量变量_pragma才能发生自动真空.

可以随时在完全自动和增量自动真空模式之间更改数据库连接. 但是,只有在数据库是新数据库(尚未创建表)或通过运行VACUUM命令时,才可以从"无"更改为"完整"或"增量". 要更改自动真空模式,请首先使用auto_vacuum编译指示来设置新的所需模式,然后调用VACUUM命令重新组织整个数据库文件. 要从"完整"或"增量"变回"无",即使在空数据库上也始终需要运行VACUUM .

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

PRAGMA automatic_index

PRAGMA automatic_index;
; PRAGMA automatic_index = ;

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

默认情况下,自3.7.17版 (2013-05-20)起启用自动索引 ,但是在将来的SQLite版本中可能会更改. PRAGMA busy_timeout


PRAGMA busy_timeout;
; PRAGMA busy_timeout = ;

查询或更改繁忙超时的设置. 该实用程序是sqlite3_busy_timeout() C语言接口的替代方法,该接口可用作实用程序,可用于不直接访问sqlite3_busy_timeout()的语言绑定.

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


PRAGMA cache_size;
PRAGMA ; cache_size = ;
PRAGMA ; cache_size =- ;

查询或更改每个打开的数据库文件一次SQLite将在内存中保留的数据库磁盘页的建议最大数目. 应用程序定义的页面缓存将决定是否接受该建议. 内置在SQLite中的默认页面缓存会接受该请求,但是,其他应用程序定义的页面缓存实现可以选择以不同的方式解释建议的缓存大小,或者将其全部忽略. 建议的默认高速缓存大小为-2000,这意味着高速缓存大小限制为2048000字节的内存. 可以使用SQLITE_DEFAULT_CACHE_SIZE编译时选项来更改默认的建议缓存大小. TEMP数据库的默认建议缓存大小为0页.

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

The behavior of cache_size with a negative N was different prior to version 3.7.10 (2012-01-16). 版本3.7.10 (2012-01-16)之前具有负N的cache_size的行为不同. 在早期版本中,缓存中的页面数设置为N的绝对值.

当您使用cache_size编译指示更改缓存大小时,该更改仅在当前会话中有效. 关闭并重新打开数据库后,缓存大小将恢复为默认值.

默认的页面缓存实现不会一次分配全部的缓存内存. 高速缓存按需按较小的块分配. page_cache设置是(建议的)上限,用于缓存可以使用的内存量,而不是其将一直使用的内存量. 这是默认页面缓存实现的行为,但是应用程序定义的页面缓存可以随意改变行为. PRAGMA cache_spill


PRAGMA cache_spill;
; PRAGMA cache_spill = ;
PRAGMA ; cache_spill = ;

cache_spill编译指示启用或禁用分页器在事务中间将脏的缓存页面溢出到数据库文件的功能. 默认情况下,Cache_spill是启用的,并且大多数应用程序都应采用这种方式,因为缓存溢出通常是有利的. 但是,缓存溢出具有获取数据库文件上的EXCLUSIVE锁的副作用. 因此,某些具有大量长时间运行的事务的应用程序可能希望禁用缓存溢出,以防止应用程序在事务COMMIT之前获取数据库的排他锁.

" form of this pragma sets a minimum cache size threshold required for spilling to occur. 此编译指示的" PRAGMA cache_spill = "形式设置发生溢出所需的最小高速缓存大小阈值. 缓存中的页面数必须同时超过cache_spill阈值和PRAGMA cache_size语句设置的最大缓存大小,才能发生溢出.

" form of this pragma applies across all databases attached to the database connection. 该编译指示的" PRAGMA cache_spill = "形式适用于连接到数据库连接的所有数据库. " form of this statement only applies to the "main" schema or whatever other schema is specified as part of the statement. 但是此语句的" PRAGMA cache_spill = "形式仅适用于"主"模式或该语句中指定的任何其他模式. PRAGMA case_sensitive_like


; PRAGMA case_sensitive_like = ;

LIKE运算符的默认行为是忽略ASCII字符的大小写. 因此,默认情况下, " a"(如" A")为true. 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语言接口的行为,该行为始终不区分大小写.

PRAGMA cell_size_check

PRAGMA cell_size_check
; PRAGMA cell_size_check = ;

当最初从磁盘读取b-tree页面时,cell_size_check pragma启用或禁用对数据库b-tree页面的其他完整性检查. 启用单元格大小检查后,可以更早地检测到数据库损坏,并且不太可能"扩散". 但是,进行额外的检查会降低性能,因此默认情况下将禁用单元格大小检查. PRAGMA checkpoint_fullfsync


PRAGMA checkpoint_fullfsync
; PRAGMA checkpoint_fullfsync = ;

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

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

PRAGMA collat​​ion_list

PRAGMA collat​​ion_list;

返回为当前数据库连接定义的整理序列的列表.

PRAGMA compile_options

PRAGMA compile_options;

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

PRAGMA count_changes

PRAGMA count_changes;
PRAGMA count_changes =布尔值;

查询或更改计数更改标志. 通常,当未设置count-changes标志时, INSERTUPDATEDELETE语句不返回任何数据. 设置计数更改后,这些命令中的每条命令都返回一行数据,该数据由一个整数值组成-该命令插入,修改或删除的行数. 返回的更改计数不包括触发器执行的任何插入,修改或删除, 外键操作自动进行的任何更改或upsert引起的更新 .

获取行更改计数的另一种方法是使用sqlite3_changes()sqlite3_total_changes()接口. 但是,有一个细微的不同. 当使用INSTEAD OF触发器对视图运行INSERT,UPDATE或DELETE时,count_changes编译指示将报告触发该触发器的视图中的行数,而sqlite3_changes()sqlite3_total_changes()则不会.

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA data_store_directory

PRAGMA data_store_directory;
'; PRAGMA data_store_directory =' ';

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

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

此功能是为WinRT提供的,它不具有用于读取或更改当前工作目录的OS机制. 不建议在任何其他情况下使用该实用程序,并且在将来的发行版中可能会禁止使用该实用程序.

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA data_version

PRAGMA data_version;

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

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

" PRAGMA data_version"值是每个数据库连接的本地属性,因此即使基础数据库相同,两次在不同数据库连接上并发调用" PRAGMA data_version"所返回的值也常常不同. 比较在两个不同时间点由同一数据库连接返回的" PRAGMA data_version"值才有意义. PRAGMA database_list


PRAGMA database_list;

此实用程序的作用就像查询一样,为连接到当前数据库连接的每个数据库返回一行. 第二列是用于主数据库文件的" main",用于存储TEMP对象的数据库文件的" temp"或用于其他数据库文件的ATTACHed数据库的名称. 第三列是数据库文件本身的名称,如果数据库未与文件关联,则为空字符串.

PRAGMA default_cache_size
PRAGMA default_cache_size;
PRAGMA ; default_cache_size = ;

此编译指示查询或设置建议为每个打开的数据库文件分配的最大磁盘高速缓存页数. 该编译指示和cache_size之间的区别在于,此处设置的值在数据库连接之间保持不变 . 默认高速缓存大小的值存储在数据库文件头中偏移量48处的4字节big-endian整数中.

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA defer_foreign_keys

PRAGMA defer_foreign_keys
; PRAGMA defer_foreign_keys = ;

当defer_foreign_keys PRAGMA处于打开状态时,所有外键约束的实施都将延迟,直到最外面的事务被提交为止. defer_foreign_keys编译指示默认为OFF,因此仅当将外键约束创建为" DEFERRABLE INITIALIALDEFERRED"时才将其推迟. 在每个COMMIT或ROLLBACK处都会自动关闭defer_foreign_keys编译指示. 因此,必须为每个事务分别启用defer_foreign_keys编译指示. 当然,只有在启用了外键约束的情况下,这种编译指示才有意义.

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

PRAGMA empty_result_callbacks

PRAGMA empty_result_callbacks;
; PRAGMA empty_result_callbacks = ;

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

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

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA编码

PRAGMA编码;
PRAGMA编码='UTF-8';
PRAGMA编码='UTF-16';
PRAGMA编码='UTF-16le';
PRAGMA编码='UTF-16be';

在第一种形式中,如果已经创建了主数据库,则此编译指示将返回主数据库使用的文本编码,即'UTF-8','UTF-16le'(小尾数UTF-16编码)或' UTF-16be"(大端UTF-16编码). 如果尚未创建主数据库,则返回的值是将用于创建主数据库的文本编码(如果此会话已创建).

此编译指示的第二种形式到第五种形式设置了如果通过此会话创建主数据库将使用的编码. 字符串'UTF-16'被解释为"使用本地机器字节顺序的UTF-16编码". 创建数据库后,无法更改其文本编码,并且任何尝试都会被忽略.

一旦为数据库设置了编码,就无法更改它.

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

PRAGMA foreign_key_check

PRAGMA foreign_key_check;
PRAGMA ); foreign_key_check( );

", for foreign key constraints that are violated and returns one row of output for each violation. foreign_key_check编译指示检查数据库或称为" "的是否存在违反的外键约束 ,并为每次违反返回一行输出. 每个结果行有四列. 第一列是包含REFERENCES子句的表的名称. 第二列是包含无效REFERENCES子句的行的rowid ;如果子表是WITHOUT ROWID表,则为NULL. 第三列是所引用表的名称. 第四列是失败的特定外键约束的索引. 在foreign_key_check编译指示的输出处的第四列是相同的整数作为输出的第一列foreign_key_list编译 . " is specified, the only foreign key constraints checked are those created by REFERENCES clauses in the CREATE TABLE statement for . 指定" "时,检查的唯一外键约束是由CREATE TABLE语句中的 REFERENCES子句创建的约束.

PRAGMA foreign_key_list

); PRAGMA foreign_key_list( );

". 对于由" "表的CREATE TABLE语句中的REFERENCES子句创建的每个外键约束,此编译指示均返回一行. PRAGMA外键


PRAGMA外键;
; PRAGMA foreign_keys = ;

查询,设置或清除外键约束的执行.

这种语用是交易中的禁忌. 仅当没有待处理的BEGINSAVEPOINT时,才可以启用或禁用外键约束强制.

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

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


PRAGMA freelist_count;

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

PRAGMA full_column_names

PRAGMA full_column_names;
; PRAGMA full_column_names = ;

查询或更改full_column_names标志. 此标志与short_column_names标志一起确定SQLite将名称分配给SELECT语句的结果列的方式. 通过按顺序应用以下规则来命名结果列:

  1. 如果结果上有一个AS子句,则该列的名称位于AS子句的右侧.

  2. 如果结果是通用表达式,而不仅仅是源表列的名称,那么结果的名称就是表达式文本的副本.

  3. 如果short_column_names编译指示为ON,则结果的名称为不带源表名称前缀COLUMN的源表列的名称.

  4. 如果两个编译指示short_column_namesfull_column_names都为OFF,则情况(2)适用.

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

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA全同步

PRAGMA全同步
; PRAGMA fullfsync = ;

查询或更改fullfsync标志. 此标志确定F_FULLFSYNC同步方法是否在支持该方法的系统上使用. fullfsync标志的默认值是off. 仅Mac OS X支持F_FULLFSYNC.

另请参阅checkpoint_fullfsync .

PRAGMA function_list

PRAGMA function_list;

该编译指示返回数据库连接已知的SQL函数列表. PRAGMA ignore_check_constraints


; PRAGMA ignore_check_constraints = ;

此实用程序启用或禁用CHECK约束的执行. 默认设置为off,表示默认情况下会强制执行CHECK约束.

PRAGMA增量真空

PRAGMA ; 增量真空 ;
PRAGMA 增量真空;

pages to be removed from the freelist . incremental_vacuum用法导致从空闲列表中删除最多页面. 数据库文件将被截断相同数量. 如果数据库不在auto_vacuum = incremental模式下,或者空闲列表中没有页面,则增量_vacuum编译指示无效. pages on the freelist, or if is less than 1, or if the "( )" argument is omitted, then the entire freelist is cleared. 如果空闲列表上的页面少于 ,或者小于1,或者省略了"( )"参数,那么将清除整个空闲列表.

PRAGMA index_info

PRAGMA ); index_info( );

该编译指示为命名索引中的每个键列返回一行. 键列是在创建索引CREATE INDEX索引语句或UNIQUE约束PRIMARY KEY约束中实际命名的列. 索引条目通常还包含辅助列,这些辅助列指向要建立索引的表行. 辅助索引列未由index_info编译指示显示,但由index_xinfo编译指示列出.

index_info用法的输出列如下:

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

but there is a WITHOUT ROWID table with that name, then (as of SQLite version 3.30.0 on 2019-10-04) this pragma returns the PRIMARY KEY columns of the WITHOUT ROWID table as they are used in the records of the underlying b-tree, which is to say with duplicate columns removed. 如果没有名为但是有一个具有该名称的WITHOUT ROWID表,则(从2019-10-04的SQLite 版本3.30.0开始),此编译指示将返回WITHOUT ROWID表的PRIMARY KEY列,因为它们用于底层b树的记录中,也就是说删除了重复的列. PRAGMA index_list


PRAGMA ); index_list( );

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

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

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

PRAGMA index_xinfo

PRAGMA ); index_xinfo( );

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

index_xinfo用法的输出列如下:

  1. 索引中列的等级. (0表示最左侧.关键列位于辅助列之前.)
  2. 被索引表中的列的排名;如果index-column是被索引表的rowid ,则为-1,如果索引位于expression上,则为 -2.
  3. 被索引列的名称;如果index-column是被索引表的rowidexpression,则为NULL.
  4. 如果索引列按索引反向(DESC)排序,则为1;否则为0.
  5. 整理序列的名称,用于比较索引列中的值.
  6. 如果索引列是键列,则为1;如果索引列是辅助列,则为0.

but there is a WITHOUT ROWID table with that name, then (as of SQLite version 3.30.0 on 2019-10-04) this pragma returns the columns of the WITHOUT ROWID table as they are used in the records of the underlying b-tree, which is to say with de-duplicated PRIMARY KEY columns first followed by data columns. 如果没有名为但存在具有该名称的WITHOUT ROWID表,则(从2019-10-04的SQLite 版本3.30.0开始),此编译指示将返回使用时WITHOUT ROWID表的列在基础b树的记录中,也就是说,首先是具有重复数据删除的PRIMARY KEY列,然后是数据列. PRAGMA完整性检查


PRAGMA 完整性检查;
PRAGMA ) 完整性检查( )

该编译指示对整个数据库进行完整性检查. integrity_check杂注查找乱序记录,缺少页面,格式错误的记录,缺少索引条目以及UNIQUE,CHECK和NOT NULL约束错误. 如果integration_check编译指示发现问题,则返回描述问题的字符串(多行,每行一列). errors before the analysis quits, with N defaulting to 100. If pragma integrity_check finds no errors, a single row with the value 'ok' is returned. 在退出分析之前,Pragma integrity_check将最多返回错误,N默认为100.如果pragma integrity_check未发现错误,则返回值为'ok'的一行.

PRAGMA integrity_check找不到FOREIGN KEY错误. 使用PRAGMA foreign_key_check命令来查找FOREIGN KEY约束中的错误.

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

PRAGMA journal_mode

PRAGMA journal_mode;
PRAGMA journal_mode =

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

. 此编译指示的第一种形式查询的当前日记记录模式. is omitted, the "main" database is queried. 如果省略 ,"主"查询数据库.

" or for all attached databases if " " is omitted. 如果省略了" ",则第二种形式将更改" "或所有附加数据库的日志记录模式. 返回新的日志模式. 如果日记模式无法更改,则返回原始日记模式.

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

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

PERSIST日志记录模式可防止在每个事务结束时删除回滚日志. 而是,日记的标题被零覆盖. 这将防止其他数据库连接回滚日志. PERSIST日记模式在平台上的优化非常有用,在该平台上,删除或截断文件比用零覆盖文件的第一块要贵得多. 另请参阅: PRAGMA journal_size_limitSQLITE_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日记模式时应用程序在事务中间崩溃,则数据库文件很可能会损坏 . 没有日志,语句将无法在约束错误之后展开部分完成的操作. 这也可能使数据库处于损坏状态. 例如,如果重复的条目导致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
PRAGMA ; journal_size_limit = ;

如果数据库连接以排他锁定模式持久日志模式 (PRAGMA journal_mode = persist)运行,则在提交事务后, 回滚日志文件可能会保留在文件系统中. 由于覆盖现有文件的速度比追加到文件的速度要快,因此这可以提高后续事务的性能,但同时也会占用文件系统空间. 在进行大量事务(例如VACUUM )之后,回滚日志文件可能会占用大量空间.

同样,在WAL模式下 ,预写日志文件不会在checkpoint之后被截断. 相反,由于覆盖比添加要快,因此SQLite会将现有文件重用于后续的WAL条目.

journal_size_limit杂注可用于限制事务或检查点之后留在文件系统中的rollback-journal和WAL文件的大小. 每次提交事务或重置WAL文件时,SQLite都会将文件系统中剩余的回滚日志文件或WAL文件的大小与此编译指示设置的大小限制进行比较,如果日志或WAL文件较大,则会将其截断到极限.

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

此编译指示仅对在编译指示名称之前指定的单个数据库起作用(如果未指定数据库,则对"主"数据库起作用).无法使用单个PRAGMA语句更改所有连接数据库的日志大小限制. 必须为每个连接的数据库分别设置大小限制. PRAGMA legacy_alter_table


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 INDEXCREATE TRIGGER语句中重写表名的初始出现. 对该表的其他引用未经修改,包括:

该编译指示的默认设置为OFF,这意味着对架构中任何位置的表的所有引用都将转换为新名称.

提供此实用工具是针对较旧程序的变通方法,这些较旧程序包含的代码期望在较旧版本的SQLite中发现ALTER TABLE RENAME的行为不完整. 新的应用程序应关闭此标志.

为了与较旧的虚拟表实现兼容,在运行sqlite3_module.xRename方法时会暂时打开此标志. 在sqlite3_module.xRename方法完成后,将还原此标志的值.

也可以使用sqlite3_db_config()接口的SQLITE_DBCONFIG_LEGACY_ALTER_TABLE选项来打开和关闭旧式alter table行为. PRAGMA legacy_file_format


PRAGMA legacy_file_format;
PRAGMA legacy_file_format =

此编译指示设置或查询legacy_file_format标志的值. 启用此标志时,将以文件格式创建新的SQLite数据库,该文件格式可追溯到3.0.0之前的所有版本的SQLite均可读写. 禁用该标记时,将使用最新的文件格式创建新数据库,而3.3.0之前的SQLite版本可能无法读取或写入该文件格式.

当不带任何参数发出legacy_file_format编译指示时,它将返回标志的设置. 该编译知道哪个文件格式,当前数据库是使用; 它告诉新创建的数据库将使用哪种格式.

首次打开较新文件格式的现有数据库时,legacy_file_format杂注会初始化为OFF.

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

PRAGMA锁定模式

PRAGMA 锁定模式;
PRAGMA 锁定模式=正常

此编译指示设置或查询数据库连接锁定模式. 锁定模式为NORMAL或EXCLUSIVE.

在NORMAL锁定模式下(除非使用SQLITE_DEFAULT_LOCKING_MODE在编译时进行覆盖,否则默认为默认模式),数据库连接将在每次​​读取或写入事务结束时解锁数据库文件. 当锁定模式设置为EXCLUSIVE时,数据库连接从不释放文件锁. 第一次以EXCLUSIVE模式读取数据库时,将获取并保留一个共享锁. 第一次写入数据库时​​,将获得并保留排他锁.

通过以独占方式进行的连接所获得的数据库锁可以通过以下方式释放:关闭数据库连接,或者使用此编译指示将锁定方式设置回NORMAL,然后访问数据库文件(用于读取或写入). 仅将锁定模式设置为NORMAL是不够的-直到下次访问数据库文件时,才会释放锁定.

将锁定模式设置为EXCLUSIVE的三个原因.

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

当locking_mode编译指示指定特定数据库时,例如:

PRAGMA 主. locking_mode =排他性;

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

" temp"数据库​​(存储TEMP表和索引的数据库 )和内存数据库始终使用互斥锁定模式. 临时数据库内存数据库的锁定模式无法更改. 默认情况下,所有其他数据库都使用普通锁定模式,并且受此编译指示的影响.

如果在首次进入WAL日志模式时锁定模式为EXCLUSIVE,则只有在退出WAL日志模式后才能将锁定模式更改为NORMAL. 如果在首次进入WAL日志模式时锁定模式为NORMAL,则可以在NORMAL和EXCLUSIVE之间更改锁定模式,然后随时退出,而无需退出WAL日志模式.

PRAGMA max_page_count

PRAGMA max_page_count;
PRAGMA ; max_page_count = ;

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

PRAGMA mmap_size


PRAGMA mmap_size;
PRAGMA mmap_size =

查询或更改为单个数据库上的内存映射I / O预留的最大字节数. 第一种形式(不带参数)查询当前限制. 第二种形式(带有数字参数)设置指定数据库或所有数据库(如果省略了可选数据库名称)的限制. 在第二种形式中,如果省略数据库名称,则设置的限制将成为通过后续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_config( SQLITE_CONFIG_MMAP_SIZE )的第二个参数设置的硬限制开始时间.

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

PRAGMA module_list

PRAGMA module_list;

该编译指示返回已向数据库连接注册的虚拟表模块的列表. PRAGMA优化


PRAGMA优化;
); PRAGMA优化( );
.optimize; PRAGMA .optimize;
.optimize( ); PRAGMA .optimize( );

尝试优化数据库. 所有方案都以前两种形式进行了优化,只有指定的方案以后两种形式进行了优化.

为了获得最佳的长期查询性能,而无需对应用程序模式和SQL进行详细的工程分析,建议在关闭每个数据库连接之前,应用程序运行" PRAGMAoptimize"(不带参数). 长时间运行的应用程序还可以通过设置计时器每隔几个小时运行一次" PRAGMA优化"而受益.

该实用程序通常是无操作的或几乎是无操作的,并且非常快. 但是,如果SQLite认为执行数据库优化(例如运行ANALYZE或创建新索引)将提高未来查询的性能,则可以完成一些数据库I / O. 想要限制执行的工作量的应用程序可以设置一个计时器,如果编译指示进行的时间过长,它将调用sqlite3_interrupt() .

预期此实用程序执行的优化的详细信息会随着时间的推移而改变和改进. 应用程序应预期此实用程序将在将来的版本中执行新的优化.

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

  1. 调试模式. 实际不执行任何优化,而是为要执行的每个优化返回一行文本. 默认情况下关闭.

  2. 在可能会受益的表上运行ANALYZE . 默认情况下为开. 请参阅下面的其他信息.

  3. (尚未实现)将当前会话的使用情况和性能信息记录在数据库文件中,以便可用于"优化"由将来的数据库连接运行的编译指示.

  4. (尚未实现)创建可能对最近的查询有用的索引.

默认的MASK始终为0xfffe. 0xfffe掩码表示执行除调试模式以外的所有上面列出的优化. 如果将来添加了默认情况下应禁用的新优化,则这些新优化的掩码将为0x10000或更大.

要查看无需实际执行即可完成的所有优化,请运行" PRAGMAoptimize(-1)". 要仅使用ANALYZE优化,请运行" PRAGMAoptimize(0x02)".

确定何时运行分析

在当前实现中,仅当以下所有条件都为真时,才分析表:

分析表的时间规则在将来的发行版中可能会更改. PRAGMA page_count


PRAGMA page_count;

返回数据库文件中的总页数.

PRAGMA页面大小

PRAGMA 页面大小;
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


; PRAGMA parser_trace = ;

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

该杂注旨在在调试SQLite本身时使用. 仅在使用SQLITE_DEBUG编译时选项时可用.

PRAGMA pragma_list

PRAGMA pragma_list;

该编译指示返回数据库连接已知的PRAGMA命令的列表. PRAGMA query_only


PRAGMA query_only;
; PRAGMA query_only = ;

query_only编译指示在启用后会阻止对数据库文件的所有更改.

PRAGMA快速检查

PRAGMA 快速检查;
PRAGMA ) quick_check( )

该编译指示类似于完整性检查,不同之处在于它不验证UNIQUE约束并且不验证索引内容是否与表内容匹配. 通过跳过UNIQUE和索引一致性检查,quick_check的运行速度比完整性完整性检查要快得多. 否则,两个语用相同.

PRAGMA read_uncommitted

PRAGMA read_uncommitted;
; PRAGMA read_uncommitted = ;

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

有关其他信息,请参见SQLite共享缓存模式 .

PRAGMA recursive_triggers

PRAGMA recursive_triggers;
; PRAGMA recursive_triggers = ;

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

更改recursive_triggers设置会影响使用数据库连接准备的所有语句的执行,包括更改设置之前准备的语句. 更改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;
; PRAGMA reverse_unordered_selects = ;

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

如果SELECT忽略了ORDER BY子句,则SQLite不保证结果的顺序. 即使这样,结果的顺序也不会从一次运行更改到下一次运行,因此无论该顺序是什么,许多应用程序都会错误地依赖于任意输出顺序. 但是,有时新版本的SQLite将包含优化器增强功能,这些增强功能将导致没有ORDER BY子句的查询的输出顺序发生变化. 发生这种情况时,取决于特定输出顺序的应用程序可能会发生故障. 通过在禁用和启用此编译指示的情况下多次运行应用程序,可以及早发现并纠正应用程序对输出顺序的错误假设的情况,从而减少了因链接到不同版本的SQLite所引起的问题.

PRAGMA schema_version

PRAGMA schema_version;
PRAGMA ; schema_version = ;

schema_version编译指示将获取或设置数据库标头中偏移40处的schema-version整数的值.

每当更改架构时,SQLite都会自动增加架构版本. 在运行每个SQL语句时,都会检查架构版本,以确保自从准备 SQL语句以来,架构没有更改. 通过使用" PRAGMA schema_version"来颠覆此机制,可能会导致SQL语句使用过时的架构运行,这可能导致错误的答案和/或数据库损坏 .

警告:滥用该编译指示可能会导致数据库损坏 .

出于此编译指示的目的, VACUUM命令被认为是架构更改,因为VACUUM通常会更改sqlite_master表中条目的" rootpage"值.

另请参见application_id pragmauser_version pragma . PRAGMA secure_delete


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设置为" fast"时,SQLite仅在不增加I / O数量的情况下,才会用零覆盖已删除的内容. 换句话说,"快速"设置使用更多的CPU周期,但不使用更多的I / O. 这具有清除b树页面中所有旧内容的效果,但将取证痕迹留在自由列表页面上 .

如果存在附加数据库 ,但在编译指示中未指定任何数据库,则所有数据库的安全删除设置都将更改. 新连接的数据库的安全删除设置是评估ATTACH命令时主数据库的设置.

当多个数据库连接共享同一高速缓存时,更改一个数据库连接上的安全删除标志将对其全部更改.

PRAGMA short_column_names

PRAGMA short_column_names;
; PRAGMA short_column_names = ;

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

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMArink_memory

PRAGMArink_memory

此编译指示通过调用sqlite3_db_release_memory()来导致对其进行调用的数据库连接释放尽可能多的内存.

PRAGMA soft_heap_limit

PRAGMA soft_heap_limit
PRAGMA soft_heap_limit =

如果指定N并且它是一个非负整数,则该编译指示使用参数N调用sqlite3_soft_heap_limit64()接口. soft_heap_limit杂注总是返回与sqlite3_soft_heap_limit64 (-1)C语言函数返回的整数相同的整数.

PRAGMA统计

PRAGMA统计;

该编译指示返回有关表和索引的辅助信息. 在测试过程中使用返回的信息来帮助验证查询计划程序是否正常运行. 此实用程序的格式和含义可能会从一个发行版更改为另一个发行版. 由于它的易变性,故意不记录此实用程序的行为和输出格式.

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

PRAGMA同步

PRAGMA 同步;
PRAGMA 同步= ; ;

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

额外的 (3)
EXTRA同步与FULL完全相同,不同之处在于,在取消链接日志以在DELETE模式下提交事务之后,将同步包含回滚日志的目录. 如果提交紧随功率损耗,则EXTRA可提供额外的耐用性.
完整的 (2)
当sync为FULL(2)时,SQLite数据库引擎将使用VFS的xSync方法来确保在继续之前将所有内容安全地写入磁盘表面. 这样可以确保操作系统崩溃或电源故障不会损坏数据库. 全同步非常安全,但速度也较慢. 不处于WAL模式时,FULL是最常用的同步设置.
普通 (1)
当"同步"为"正常"(1)时,SQLite数据库引擎仍将在最关键的时刻进行同步,但同步的频率要低于"全模式". 在错误的时间出现电源故障的机会很小(尽管非零),这可能会破坏旧文件系统上journal_mode = DELETE的数据库. WAL模式可以防止使用sync = NORMAL进行破坏,并且在现代文件系统上,DELETE模式也可能是安全的. WAL模式始终与sync = NORMAL一致,但是WAL模式确实会失去耐久性. 在WAL模式下以syncon = NORMAL提交的事务可能会在断电或系统崩溃后回滚. 无论应用程序崩溃是同步设置还是日志模式,事务都可以持久保存. 对于大多数以WAL模式运行的应用程序来说, sync = NORMAL设置是一个不错的选择.
关 (0)
如果使用同步关闭(0),则SQLite将数据交给操作系统后将立即继续而不进行同步. 如果运行SQLite的应用程序崩溃,数据将是安全的,但是如果操作系统崩溃或计算机在将数据写入磁盘表面之前断电,则数据库可能会损坏 . 另一方面,通过同步关闭,提交可以快几个数量级.

WAL模式下,当sync为NORMAL(1)时,将在每个检查点之前对WAL文件进行同步,而在每个完成的检查点之后对数据库文件进行同步,并且在检查点之后开始重新使用WAL文件时,将同步WAL文件头.同步操作发生在大多数事务中. 在WAL模式下,当sync = FULL时,在每次事务提交后都会发生WAL文件的附加同步操作. 每笔交易之后的额外WAL同步有助于确保交易在断电后具有持久性. 事务是否与sync = FULL提供的额外同步一致,也可以不同步. 如果不考虑耐用性,那么在WAL模式下通常只需要sync = NORMAL.

TEMP模式始终具有sync = OFF,因为TEMP的内容是短暂的,并且预计不会在断电后继续存在. 更改TEMP同步设置的尝试将被忽略.

另请参见fullfsynccheckpoint_fullfsync编译指示.

PRAGMA table_info

PRAGMA ); table_info( );

该编译指示为命名表中的每一列返回一行. 结果集中的列包括列名称,数据类型,该列是否可以为NULL以及该列的默认值. 对于不属于主键的列,结果集中的" pk"列为零,对于属于主键的列,其为主键中列的索引.

table_info杂注中命名的表也可以是视图.

另请参阅: PRAGMA table_xinfo PRAGMA table_xinfo


PRAGMA ); table_xinfo( );

该编译指示为命名表中的每一列返回一行,包括虚拟表中的隐藏列 . 输出与PRAGMA table_info相同,除了显示而不是省略隐藏列. PRAGMA temp_store


PRAGMA temp_store;
PRAGMA temp_store = ; ;

查询或更改" 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 普拉玛
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;
'; PRAGMA temp_store_directory =' ';

查询或更改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全局变量,并且该全局变量不受互斥锁的保护.

should be enclosed in single quotes. 值应该用单引号引起来. to an empty string, eg, . 要将目录还原为默认目录,请将设置为空字符串,例如 . is not found or is not writable. 如果找不到或不可写,则会引发错误.

临时文件的默认目录取决于操作系统. 某些OS界面可能选择忽略此变量,并将临时文件放置在与此处指定目录不同的其他目录中. 从这个意义上讲,这种实用主义只是建议性的.

不建议使用此编译指示,并且仅为了向后兼容而存在. 新的应用程序应避免使用此编译指示. 较旧的应用程序应尽早停止使用该实用程序. 使用SQLITE_OMIT_DEPRECATED编译SQLite时,可以从构建中省略此编译指示.

PRAGMA线程

PRAGMA线程;
; PRAGMA线程= ;

查询或更改当前数据库连接的sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...)限制的值. 此限制设置了允许启动准备好的语句以协助查询的辅助线程数的上限. 除非使用SQLITE_DEFAULT_WORKER_THREADS编译时选项进行更改,否则默认限制为0. 当限制为零时,这意味着将不启动任何辅助线程.

实用程序是围绕sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...)接口的薄包装.

PRAGMA user_version

PRAGMA user_version;
PRAGMA ; user_version = ;

user_version编译指示将获取或设置数据库标头中偏移60处的user-version整数的值. 用户版本是一个整数,应用程序可以根据需要使用它. SQLite不使用用户版本本身.

另请参见application_id pragmaschema_version pragma . PRAGMA vdbe_addoptrace


; PRAGMA vdbe_addoptrace = ;

如果使用SQLITE_DEBUG编译时选项编译了SQLite,则可以使用vdbe_addoptrace编译指示在代码生成期间创建完整的VDBE操作码时显示它们. 此功能用于调试SQLite本身. 有关更多信息,请参见VDBE文档 .

该杂注旨在在调试SQLite本身时使用. 仅在使用SQLITE_DEBUG编译时选项时可用.

PRAGMA vdbe_调试

; PRAGMA vdbe_debug = ;

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

该杂注旨在在调试SQLite本身时使用. 仅在使用SQLITE_DEBUG编译时选项时可用.

PRAGMA vdbe_listing

; PRAGMA vdbe_listing = ;

如果已使用SQLITE_DEBUG编译时选项编译了SQLite,则可以使用vdbe_listing编译指示使虚拟机操作码的完整列表出现在标准输出中,从而评估每个语句. 启用列表后,程序的全部内容就在开始执行之前被打印出来. 列表打印后,该语句正常执行. 此功能用于调试SQLite本身. 有关更多信息,请参见VDBE文档 .

该杂注旨在在调试SQLite本身时使用. 仅在使用SQLITE_DEBUG编译时选项时可用.

PRAGMA vdbe_trace

; PRAGMA vdbe_trace = ;

如果已使用SQLITE_DEBUG编译时选项编译了SQLite,则可以使用vdbe_trace编译指示在评估虚拟机操作码时将其打印在标准输出上. 此功能用于调试SQLite. 有关更多信息,请参见VDBE文档 .

该杂注旨在在调试SQLite本身时使用. 仅在使用SQLITE_DEBUG编译时选项时可用.

PRAGMA wal_autocheckpoint

PRAGMA wal_autocheckpoint;
; PRAGMA wal_autocheckpoint = ;

此实用程序查询或设置预写日志 自动检查点间隔. pages in length. 启用预写日志后 (通过journal_mode pragma ),只要预写日志的长度等于或超过页,就会自动运行检查点. 将自动检查点大小设置为零或负值将关闭自动检查点.

该编译指示是sqlite3_wal_autocheckpoint() C接口的包装. 所有自动检查点均为PASSIVE .

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

PRAGMA wal_checkpoint

PRAGMA wal_checkpoint;
PRAGMA wal_checkpoint(通过);
PRAGMA wal_checkpoint(FULL);
PRAGMA wal_checkpoint(RESTART);
PRAGMA wal_checkpoint(TRUNCATE);

, or on all attached databases if is omitted. 如果启用了预写日志 (通过journal_mode pragma ),则该杂注将使检查点操作在数据库上运行,或者在所有连接的数据库上运行(如果省略了 ). 如果禁用了预写日志模式,则该编译指示是无害的无操作.

不带参数调用此编译指示等效于调用sqlite3_wal_checkpoint() C接口.

使用参数调用此编译指示等效于使用与参数对应的第三个参数调用sqlite3_wal_checkpoint_v2() C接口:
被动
检查点尽可能多的帧,而无需等待任何数据库读取器或写入器完成. 如果日志中的所有框架都已检查点,则同步数据库文件. 此模式与调用sqlite3_wal_checkpoint() C接口相同. 在此模式下,永远不会调用busy-handler回调 .
充分
此模式将阻塞(调用busy-handler回调 ),直到没有数据库写入器并且所有读取器都从最新的数据库快照读取数据为止. 然后,它在日志文件中检查所有帧并同步数据库文件. FULL在运行时阻止并发写入器,但读取器可以继续.
重新开始
此模式的功能与FULL相同,不同之处在于,在对日志文件进行检查点之后,它将阻塞(调用busy-handler回调 ),直到所有读取器都完成了日志文件. 这样可以确保下一个要写入数据库文件的客户端从头开始重新启动日志文件. RESTART在运行时阻止并发写入器,但允许读取器继续进行.
截短
此模式的工作方式与重新启动相同,另外,成功完成后,WAL文件将被截断为零字节.

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

PRAGMA writable_schema

; PRAGMA writable_schema = ;

当此编译指示打开并且SQLITE_DBCONFIG_DEFENSIVE标志关闭时,可以使用普通的UPDATEINSERTDELETE语句更改sqlite_master表. 警告:滥用该编译指示很容易导致数据库文件损坏 .


by  ICOPY.SITE