`
1025250620
  • 浏览: 229881 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

sqlite 指令(一)

 
阅读更多

SQLite支持的编译指令(pragma)

PRAGMA命令是用于修改SQlite库或查询SQLite库内部数据(non-table)的特殊命令。PRAGMA 命令使用与其它SQLite命令(e.g. SELECT, INSERT)相同的接口,但在如下重要方面与其它命令不同:

  • 在未来的SQLite版本中部分pragma可能被删除或添加,小心使用。
  • 当使用未知的pragma语句时不产生报错。未知的pragma仅仅会被忽略,即是说若是打错了pragma语句SQLite不会提示用户。
  • 一些pragma在SQL编译阶段生效而非执行阶段。即是说若使用C语言的sqlite3_compile(), sqlite3_step(), sqlite3_finalize() API (或类似的封装接口中),pragma可能在调用sqlite3_compile()期间起作用。
  • pragma命令不与其它SQL引擎兼容。

可用的pragma命令有如下四个基本类型:


PRAGMA命令语法

sql-statement ::= PRAGMA name [value] |
PRAGMA 
function(arg)

使用整数值value的pragma也可以使用符号表示,字符串"on", "true",和 "yes" 等同于1,"off", "false",和 "no"等同于0. 这些字符串大小写不敏感且无须进行引用。无法识别的字符串被当作1且不会报错。value返回时是整数。


用于修改SQLite库的操作的Pragma

    • PRAGMA auto_vacuum; 
      PRAGMA auto_vacuum = 
      0 | 1;

      查询或设置数据库的auto-vacuum标记。

      正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中 再次使用。这种情况下使用VACUUM命令释放删除得到的空间。

      当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。

      只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。

    • PRAGMA cache_size; 
      PRAGMA cache_size = 
      Number-of-pages;

      查询或修改SQLite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000. 若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的内存的话,可以增大缓存以提高性能。

      当使用cache_size pragma改变缓存大小时,改变仅对当前对话有效,当数据库关闭重新打开时缓存大小恢复到缺省大小。 要想永久改变缓存大小,使用default_cache_size pragma.

    • PRAGMA case_sensitive_like; 
      PRAGMA case_sensitive_like = 
      0 | 1;

      LIKE运算符的缺省行为是忽略latin1字符的大小写。因此在缺省情况下'a' LIKE 'A'的值为真。可以通过打开 case_sensitive_like pragma来改变这一缺省行为。当启用case_sensitive_like,'a' LIKE 'A'为假而 'a' LIKE 'a'依然为真。

    • PRAGMA count_changes; 
      PRAGMA count_changes = 
      0 | 1;

      查询或更改count-changes标记。正常情况下INSERT, UPDATE和DELETE语句不返回数据。 当开启count-changes,以上语句返回一行含一个整数值的数据——该语句插入,修改或删除的行数。 返回的行数不包括由触发器产生的插入,修改或删除等改变的行数。

    • PRAGMA default_cache_size; 
      PRAGMA default_cache_size = 
      Number-of-pages;

      查询或修改SQLite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,它与cache_sizepragma类似,只是它永久性地改变缓存大小。 利用该pragma,你可以设定一次缓存大小,并且每次重新打开数据库时都继续使用该值。

    • PRAGMA default_synchronous;

      该语句在2.8版本中可用,但在3.0版中被去掉了。这条pragma很危险且不推荐使用,安全起见在该文档中不涉及此pragma的用法。

    • PRAGMA empty_result_callbacks; 
      PRAGMA empty_result_callbacks = 
      0 | 1;

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

      empty-result-callbacks标记仅仅影响sqlite3_exec API函数。正常情况下,empty-result-callbacks标记清空, 则对返回0行数据的命令不调用sqlite3_exec()的回叫函数,当设置了empty-result-callbacks,则调用回叫 函数一次,置第三个参数为0 (NULL).这使得使用sqlite3_exec() API的程序即使在一条查询不返回数据时依然检索字段名。

    • PRAGMA encoding; 
      PRAGMA encoding = "UTF-8"; 
      PRAGMA encoding = "UTF-16"; 
      PRAGMA encoding = "UTF-16le"; 
      PRAGMA encoding = "UTF-16be";

      在第一种形式中,若主数据库已创建,这条pragma返回主数据库使用得文本编码格式,为 "UTF-8", "UTF-16le" (little-endian UTF-16 encoding) 或者"UTF-16be" (big-endian UTF-16 encoding)中的一种。 若主数据库未创建,返回值为当前会话创建的主数据库将要使用的文本编码格式。

      第二种及以后几种形式只在主数据库未创建时有效。这时该pragma设置当前会话创建的主数据库将要使用的文本编码格式。 "UTF-16"表示"使用本机字节顺序的UTF-16编码"。若这些形式在主数据库创建后使用,将被忽略且不产生任何效果。

      数据库的编码格式设置后不能够被改变。

      ATTACH命令创建的数据库使用与主数据库相同的编码格式。

    • PRAGMA full_column_names; 
      PRAGMA full_column_names = 
      0 | 1;

      查询或更改the full-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或通配符"*"时) 返回的字段名的方式。正常情况下,当SELECT语句将两个或多个表连接时, 这类结果字段的返回名为 ,当SELECT语句查询一个单独的表时, 返回字段名为。当设置了full-column-names标记,返回的字段名将统一为 不管是否对表进行了连接。

      若short-column-names和full-column-names标记同时被设置,则使用full-column-names方式。

    • PRAGMA fullfsync 
      PRAGMA fullfsync = 
      0 | 1;

      查询或更改fullfsync标记。该标记决定是否在支持的系统上使用F_FULLFSYNC同步模式。缺省值为off.截至目前(2006-02-10) 只有Mac OS X 系统支持F_FULLFSYNC.

    • PRAGMA page_size; 
      PRAGMA page_size = 
      bytes;

      查询或设置page-size值。只有在未创建数据库时才能设置page-size。页面大小必须是2的整数倍且大于等于512小于等于8192。 上限可以通过在编译时修改宏定义SQLITE_MAX_PAGE_SIZE的值来改变。上限的上限是32768.

    • PRAGMA read_uncommitted; 
      PRAGMA read_uncommitted = 
      0 | 1;

      查询,设置或清除READ UNCOMMITTED isolation(读取未授权的分隔符).缺省的SQLite分隔符等级是SERIALIZABLE. 任何线程或进程可选用READ UNCOMMITTED isolation,但除了共享公共页和schema缓存的连接之间以外的地方也会 使用SERIALIZABLE.缓存共享通过sqlite3_enable_shared_cache() API开启,且只在运行同一线程的连接间有效。缺省情况下缓存共享是关闭的。

    • PRAGMA short_column_names; 
      PRAGMA short_column_names = 
      0 | 1;

      查询或更改the short-column-names标记。该标记影响SQLite命名SELECT语句(当字段表达式为表-字段或通配符"*"时) 返回的字段名的方式。正常情况下,当SELECT语句将两个或多个表连接时, 这类结果字段的返回名为 ,当SELECT语句查询一个单独的表时, 返回字段名为。当设置了full-column-names标记,返回的字段名将统一为 不管是否对表进行了连接。

      若short-column-names和full-column-names标记同时被设置,则使用full-column-names方式。

    • PRAGMA synchronous; 
      PRAGMA synchronous = FULL; 
      (2) 
      PRAGMA synchronous = NORMAL; 
      (1) 
      PRAGMA synchronous = OFF; 
      (0)

      查询或更改"synchronous"标记的设定。第一种形式(查询)返回整数值。 当synchronous设置为FULL (2), SQLite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘。 这使系统崩溃或电源出问题时能确保数据库在重起后不会损坏。FULL synchronous很安全但很慢。 当synchronous设置为NORMAL, SQLite数据库引擎在大部分紧急时刻会暂停,但不像FULL模式下那么频繁。 NORMAL模式下有很小的几率(但不是不存在)发生电源故障导致数据库损坏的情况。但实际上,在这种情况 下很可能你的硬盘已经不能使用,或者发生了其他的不可恢复的硬件错误。 设置为synchronous OFF (0)时,SQLite在传递数据给系统以后直接继续而不暂停。若运行SQLite的应用程序崩溃, 数据不会损伤,但在系统崩溃或写入数据时意外断电的情况下数据库可能会损坏。另一方面,在synchronous OFF时 一些操作可能会快50倍甚至更多。

      在SQLite 2中,缺省值为NORMAL.而在3中修改为FULL.

    • PRAGMA temp_store; 
      PRAGMA temp_store = DEFAULT;
       (0) 
      PRAGMA temp_store = FILE;
       (1) 
      PRAGMA temp_store = MEMORY;
       (2)

      查询或更改"temp_store"参数的设置。当temp_store设置为DEFAULT (0),使用编译时的C预处理宏 TEMP_STORE来定义储存临时表和临时索引的位置。当设置为MEMORY (2)临时表和索引存放于内存中。 当设置为FILE (1)则存放于文件中。temp_store_directory pragma 可用于指定存放该文件的目录。当改变temp_store设置,所有已存在的临时表,索引,触发器及视图将被立即删除。

      库中的编译时C预处理标志TEMP_STORE可以覆盖该pragma设置。下面的表给出TEMP_STORE预处理宏和 temp_store pragma交互作用的总结:

      TEMP_STORE PRAGMA
      temp_store 临时表和索引
      使用的存储方式
      0 any 文件
      1 0 文件
      1 1 文件
      1 2 内存
      2 0 内存
      2 1 文件
      2 2 内存
      3 any 内存


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

    查询或更改"temp_store_directory"设置——存储临时表和索引的文件所在的目录。 仅在当前连接有效,在建立新连接时重置为缺省值。

    当改变了temp_store_directory设置,所有已有的临时表,索引,触发器,视图会被直接删除。 建议在数据库一打开时就设置好temp_store_directory.

    directory-name需用单引号引起来。要想恢复缺省目录,把directory-name设为空字符串。例如 PRAGMA temp_store_directory = ''.若directory-name未找到或不可写会引发错误。

    临时文件的缺省目录与主机的系统有关,使用Unix/Linux/OSX系统的主机,缺省目录是如下序列之中第一个可写的 /var/tmp, /usr/tmp, /tmp,current-directory.对于Windows NT,缺省目录由Windows决定,一般为 C:\Documents and Settings\user-name\Local Settings\Temp\. SQLite创建的临时文件在使用完毕时就被unlink,所以操作系统可以在SQLite进程进行中自动删除临时文件。 于是,正常情况下不能通过ls 或 dir命令看到临时文件。


用于查询数据库的schema的Pragma

    • PRAGMA database_list;

      对每个打开的数据库,使用该数据库的信息调用一次回叫函数。使用包括附加的数据库名和索引名在内的参数。第一行用于主数据库,第二行用于存放临时表的临时数据库。

    • PRAGMA foreign_key_list(table-name);

      对于参数表中每个涉及到字段的外键,使用该外键的信息调用一次回叫函数。每个外键中的每个字段都将调用一次回叫函数。

    • PRAGMA index_info(index-name);

      对该索引涉及到的每个字段,使用字段信息(字段名,字段号)调用一次回叫函数。

    • PRAGMA index_list(table-name);

      对表中的每个索引,使用索引信息调用回叫函数。参数包括索引名和一个指示索引是否唯一的标志。

  • PRAGMA table_info(table-name);

    对于表中的每个字段,使用字段信息(字段名,数据类型,可否为空,缺省值)调用回叫函数。


用于查询/更改版本信息的Pragma

  • PRAGMA [database.]schema_version; 
    PRAGMA [database.]schema_version = 
    integer 
    PRAGMA [database.]user_version; 
    PRAGMA [database.]user_version = 
    integer ;

    这两条pragma分别用于设置schema-version和user-version的值。schema-version 和user-version均为32位有符号整数,存放于数据库头中。

    schema-version通常只由SQLite内部操作。每当数据库的schema改变时(创建或撤消表或索引),SQLite 将这个值增大。schema版本在每一次query被执行时被SQLite所使用,以确定编译SQL query时内部cache的schema与编译后的query实际执行时数据库的schema相匹配。使用"PRAGMA schema_version"更改schema-version会破坏这一机制,有导致程序崩溃或数据库损坏的潜在危险。请小心使用!

    user-version不在SQLite内部使用,任何程序可以用它来做任何事。


用于库debug的Pragma

    • PRAGMA integrity_check;

      该命令对整个数据库进行完整性检查,查找次序颠倒的记录,丢失的页,残缺的记录以及损坏的索引。若发现任何问题则返回一形容问题所在的字符串,若一切正常返回"ok".

    • PRAGMA parser_trace = ON; (1) 
      PRAGMA parser_trace = OFF;
       (0)

      打开或关闭SQLite库中的SQL语法分析追踪,用于debug.只有当SQLite不使用NDEBUG宏进行编译时该pragma才可用。

    • PRAGMA vdbe_trace = ON; (1) 
      PRAGMA vdbe_trace = OFF;
       (0)

      打开或关闭SQLite库中的虚拟数据库引擎追踪,用于debug.更多信息,察看 VDBE文档

  • PRAGMA vdbe_listing = ON; (1) 
    PRAGMA vdbe_listing = OFF;
     (0)

    打开或关闭虚拟机程序列表,当开启列表功能,整个程序的内容在执行前被打印出来,就像在每条语句之前自动执行EXPLAIN. 语句在打印列表之后正常执行。用于debug.更多信息,察看VDBE文档

分享到:
评论

相关推荐

    sqlite3和命令大全

    这个压缩包包含了一些与SQLite3相关的工具和文档,如SQLite3的动态链接库sqlite3.dll、可执行文件sqlite3.exe、分析器sqlite3_analyzer.exe以及sqlitediff工具等,同时还有一个关于SQLite3命令行操作的大全文档。...

    C#解决SQlite并发异常问题的方法(使用读写锁)

    SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。但在C#中未提供类似功能。 作者利用读写锁...

    sqlite命令大全

    Sqlite3是一款轻量级的关系型数据库管理系统,其特点在于无需单独的服务进程,所有的数据库管理功能都是通过一个库文件来实现的,非常适合嵌入式应用环境。本文将详细介绍Sqlite3的基本命令和常用操作。 #### 二、...

    sqlite3-用于SVN下的数据指令操作

    SQLite3的数据指令操作主要包括以下几类: 1. 数据库连接与断开: 使用`sqlite3 <database>`命令可以打开或创建一个SQLite3数据库。例如,如果你有一个名为`repo.db`的SVN仓库数据库,你可以输入`sqlite3 repo.db`...

    sqlite.lib+sqlite.h+sqlite.dll

    2. **准备SQL语句**:使用`sqlite3_prepare_v2()`将SQL语句预编译为一个虚拟机指令序列,返回一个准备好的语句句柄。 3. **执行SQL**:通过`sqlite3_step()`来执行预编译的SQL语句,每次调用会执行一次直到完成或...

    AndroidSQLite 指令

    ### Android SQLite 指令详解 #### 查询(Retrieve) 在Android开发中,SQLite数据库是非常重要的一个组成部分,用于存储应用程序的数据。对于数据的操作主要包括查询、删除、更新等基本操作。其中,查询是最常用...

    SQLite3的性能优化

    SQLite3 提供了 pragma 指令来实现空间释放。通过设置 auto_vacuum 标记,可以在提交删除事务时自动释放空间。-auto_vacuum 标记的含义是:正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小...

    sqlite3含命令大全

    利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了): sqlite3 film.db 在大量插入资料时,你可能会需要先打这个指令: begin; 插入完资料后要记得打这个指令,资料才会写进...

    sqlite-source-3_3_6.zip_sqlite wince_wince sqlite_wince 数据库

    SQLite是一款轻量级的、开源的、自包含的数据库引擎,尤其适合于移动计算设备和嵌入式系统。它的设计目标是提供一个可移植的、可靠的数据存储解决方案,无需数据库管理员即可操作。SQLite源代码包"sqlite-source-3_3...

    sqlite最新源代码

    2. **SQL解析器和虚拟机**:SQLite使用词法分析器(tokenizer)和语法分析器(parser)将SQL语句转换为内部的虚拟机指令,然后由虚拟机执行。这部分源码位于`src/`目录下,如`parse.c`、`expr.c`和`vdbe.c`。 3. **...

    sqlite 源代码分析资料

    SQLite是一款开源、轻量级的关系型数据库管理系统,广泛应用于嵌入式系统和移动应用中。它的源代码简洁高效,是学习数据库系统实现和C语言编程的宝贵资源。本资料包包含SQLite的源代码、中文手册以及相关的源代码...

    SQLite头文件

    `sqlite3_prepare_v2()`函数用于将SQL语句编译为一个可执行的虚拟机指令序列,返回一个准备好的语句对象。`sqlite3_step()`函数执行准备好的语句,每次调用会推进到下一个结果行。`sqlite3_finalize()`函数用于清理...

    SQLite入门与分析

    它负责解析SQL语句,将其转化为一系列的字节码指令,然后执行这些指令来操作数据库。VDBE的工作流程包括词法分析、语法分析、优化和执行阶段,使得SQLite能高效地处理各种复杂的SQL查询。理解VDBE的工作原理对于优化...

    sqlite 2.8.16源代码

    2. **虚拟机和执行引擎**:SQLite使用基于虚拟机的执行模型,将解析后的查询计划转换为一系列虚拟指令。这些指令在SQLite的虚拟机上执行,实现了对数据库的读写操作。 3. **B树存储结构**:SQLite采用B树(B+树)...

    sqlite-jdbc-3.32.3.2.jar-支持信创环境loongarch64、mips64el

    LoongArch64是龙芯公司推出的一种64位指令集架构,而MIPS64el则是MIPS架构的一种变体,主要面向64位系统。在这些非传统的x86平台上,许多常见的软件可能无法直接运行,因此需要专门针对这些架构编译的版本。 sqlite...

    sqlite3.exe

    sqlite3.exe是款强大的轻型数据库管理系统,它的设计目标是嵌入式的,目前在很多嵌入式产品中使用了...2、打开数据库后进入sqlite>命令行,可以使用.help查看可用指令了,也可以使用标准的SQL语句进行调试使用如update

    sqlite3的使用详解

    2. **准备SQL语句**:通过`sqlite3_prepare_v2()`函数将SQL查询语句编译为一个可执行的SQLite虚拟机指令集。这一步可以提高多次执行相同SQL语句的效率。 3. **执行SQL**:使用`sqlite3_step()`函数执行预编译的SQL...

    SQLite入门与分析.pdf

    SQLite是一种开源的嵌入式关系数据库管理系统,其设计目的是为了简化软件应用程序中的数据管理任务。SQLite不依赖于外部的数据库服务器进程,而是直接嵌入到使用它的应用程序中,并与应用程序共享同一个进程空间。...

    sqlite数据库操作指令

    SQLite 数据库是一个轻量级的关系型数据库管理系统,广泛应用于移动应用、嵌入式系统和测试环境中。以下是一些关于 SQLite 数据库操作的关键知识点,主要涉及字段的增加、删除、修改和一些其他实用的 SQL 语句。 1....

Global site tag (gtag.js) - Google Analytics