Sqlite进阶之--附加数据库关联查询以及Pragma的相关使用

2023-11-18

数据库连接

基本的

Data Source=c:\mydb.db;Version=3;
此类库不支持版本 2

内存数据库

Data Source=:memory:;Version=3;New=True;
SQLite 数据库通常存储在磁盘上,但数据库也可以存储在内存中。在此处阅读有关SQLite 内存数据库的更多信息。

使用 UTF16

Data Source=c:\mydb.db;Version=3;UseUTF16Encoding=True;

有密码

Data Source=c:\mydb.db;Version=3;Password=myPassword;

使用 3.3x 之前的数据库格式

Data Source=c:\mydb.db;Version=3;Legacy Format=True;

使用连接池

Data Source=c:\mydb.db;Version=3;Pooling=True;Max Pool Size=100;
默认情况下不启用连接池。使用以下参数来控制连接池机制。

只读连接

Data Source=c:\mydb.db;Version=3;Read Only=True;

使用 DateTime.Ticks 作为日期时间格式

Data Source=c:\mydb.db;Version=3;DateTimeFormat=Ticks;
默认值为 ISO8601,它激活了 ISO8601 日期时间格式的使用

将 GUID 存储为文本

Data Source=c:\mydb.db;Version=3;BinaryGUID=False;通常,GUID 以二进制格式存储。使用此连接字符串将 GUID 存储为文本。请注意,将 GUID 存储为文本会占用数据库中的更多空间。

指定缓存大小

Data Source=c:\mydb.db;Version=3;Cache Size=2000;以字节为单位的缓存大小值

指定页面大小

Data Source=c:\mydb.db;Version=3;Page Size=1024;以字节为单位测量的页面大小值

在分布式事务中禁用登记

Data Source=c:\mydb.db;Version=3;Enlist=N;

禁用创建数据库行为

Data Source=c:\mydb.db;Version=3;FailIfMissing=True;如果数据库文件不存在,默认行为是创建一个新文件。使用以下参数来引发错误,而不是创建新的数据库文件。

限制数据库大小

Data Source=c:\mydb.db;Version=3;Max Page Count=5000;最大页数以页为单位。该参数限制数据库的最大页数。

禁用日志文件

Data Source=c:\mydb.db;Version=3;Journal Mode=Off;这个完全禁用回滚日志。

保留日志文件

Data Source=c:\mydb.db;Version=3;Journal Mode=Persist;这个是空白的,并在提交后将日志文件留在磁盘上。默认行为是在每次提交后删除日志文件。

控制文件刷新

Data Source=c:\mydb.db;Version=3;Synchronous=Full;Full 指定在每次写入后完全刷新以执行操作。正常是默认值。Off 意味着底层操作系统刷新 I/O。

清理、压缩数据库(磁盘中freeList)

vacuum; --针对主数据库vacuum attachDb_Name; --针对附属、吸附的数据库 需要带上数据库别名(这个在使用Attach时别名是一致的)

Attach之多个数据库关联表查询

模板:

Attach database fileName as 'Alisa';Query Sql;

案例:
image.png
如图所示 peopelmanage.sqlite是主数据库 ,ken.sqlite是吸附数据库。

 string sql = @"Attach database 'F:\project_info\csharp\personal-manage\personal-manage.UI\bin\x64\Debug\database\ken.sqlite' as ken; ";  sql += "\r\n select KT.*,SYS_FILE_INFO.FILE_DISP_NAME from ken.T_TEST as KT "; sql+= " left join SYS_FILE_INFO on SYS_FILE_INFO.RELATED_PAGE = KT.PAGE ";   DataTable dataTable = baseDAL.SelectData(sql);

ps:需要把Attach语句放在最前面,因为每次连接时Attach语句生效,这个文件数据库才会绑定(成功吸附);一旦关闭连接,就丧失了吸附关系。

查询sqlite版本

sqlite_source_id()

sqlite_source_id() 函数返回一个字符串,该字符串标识用于构建 SQLite 库的源代码的特定版本。
image.png

sqlite_version()

sqlite_version() 函数返回正在运行的 SQLite 库的版本字符串。此函数是sqlite3_libversion() C 接口的 SQL 包装器。

image.png

PRAGMA 的用法

ps:下面的schema(模式),一般使用sqlite的文件名(不用带后缀)即可,当然schema也可以省略

查看索引

PRAGMA index_info('索引名');-- PRAGMA pragma_index_list('表名'); PRAGMA index_xinfo('索引名'); --查看索引信息select * from pragma_index_list('表名'); --查询具体表的索引SELECT * FROM pragma_index_info('索引名称'); -- 查看索引
--index_xinfo pragma 的输出列如下:索引中列的排名。(0 表示最左边。关键列在辅助列之前。)被索引的表中列的排名,如果 index-column 是被索引的表的rowid ,则为 -1,如果索引在表达式上,则为-2 。被索引的列的名称,如果 index-column 是被索引的表的rowid或 表达式,则为 NULL 。如果索引列按索引以反向 (DESC) 顺序排序,则为 1,否则为 0。用于比较索引列中的值 的整理序列的名称。如果索引列是键列,则为 1;如果索引列是辅助列,则为 0

获取或修改应用程序ID

PRAGMA schema.application_id; --应用程序ID

设置自动清理(压缩)数据库

ps : 当 auto-vacuum 模式为 1 或“full”时,仅当数据库存储了一些允许每个数据库页面向后追溯到其引用者的附加信息时,才可能进行自动清理。因此,必须在创建任何表之前打开自动清理。创建表后无法启用或禁用自动清理。

PRAGMA schema.auto_vacuum;--查询或设置数据库的自动清空状态  ‘0’.禁止自动清理  ‘1’.启用基础清理  ‘none’:禁止自动清理  ‘2’或者full”.启动完全清理   ‘INCREMENTAL’:增量当 auto-vacuum 模式为 1 或“full”时,freelist 页面被移动到数据库文件的末尾,并且数据库文件被截断以在每次事务提交时删除 freelist 页面。但是请注意,自动清理只会截断文件中的空闲列表页面。Auto-vacuum 不会像 VACUUM命令那样对数据库进行碎片整理,也不会重新打包单个数据库页面。事实上,因为它在文件中移动页面,所以自动真空实际上会使碎片变得更糟当 auto-vacuum 的值为 2 或“INCREMENTAL”时(在增量模式下, 必须调用单独的incremental_vacuum pragma 以才能自动清理。)---已验证

已经建表了 需要如下操作 才能更改auto_vacuum的值

PRAGMA main.auto_vacuum =2;VACUUM;

设置增量清理

PRAGMA schema.incremental_vacuum(N);PRAGMA schema.incremental_vacuum;

incremental_vacuum pragma 导致从freelist中删除最多_N_个页面。数据库文件被截断相同的数量。如果数据库未处于 auto_vacuum=incremental模式或 freelist 上没有页面,则 incremental_vacuum pragma 无效。如果freelist 上的页数少于 _N ,或者N_小于 1,或者如果省略了 “( N )” 参数,则清除整个 freelist。

检查外键

PRAGMA foreign_key_check('表名');

查看数据版本

PRAGMA data_version; --查看数据版本

获取数据库列表 (能查看吸附的相关表)

PRAGMA database_list; -- 将用于列出了所有的数据库连接 main为主数据库 temp一般为临时数据库 详见附加数据库

设置/获取 数据库编码

PRAGMA encoding; --一旦数据库设置了编码 就不能更改  由ATTACH命令创建的数据库始终使用与主数据库相同的编码

数据库完整性检查

PRAGMA shemech.integrity_check; --对数据库进行低级格式化和一致性检查此 pragma 对数据库进行低级格式化和一致性检查。完整性检查杂注寻找:乱序的表或索引条目格式错误的记录缺少页面缺少或多余的索引条目UNIQUE、CHECK 和 NOT NULL 约束错误freelist的完整性多次使用或根本不使用的数据库部分

数据库优化

1.PRAGMA  totalParse.optimize; --为了获得最佳的长期查询性能而不需要对应用程序模式和 SQL 进行详细的工程分析,建议应用程序在关闭每个数据库连接之前运行“PRAGMA optimize”(不带参数) 。长时间运行的应用程序也可能受益于设置计时器以每隔几个小时运行一次“PRAGMA 优化”。2.PRAGMA  totalParse.optimize(ANALYZE); //带参数 

快速检查;

类似于完整性检查

PRAGMA quick_check;--- 快速检查; 类似于完整性检查,只是它不验证 UNIQUE 约束,也不验证索引内容是否与表内容匹配。通过跳过 UNIQUE 和索引一致性检查,quick_check 能够运行得更快。PRAGMA quick_check('表名'); 

返回有关模式中的表和视图的信息

PRAGMA schema.table_list; ---返回有关模式中的表和视图的信息,每行输出一个表,版本不低于 3.37.0PRAGMA table_list('表名');

查询架构版本

PRAGMA schema.schema_version; ---查询架构版本

设置/获取用户版本

PRAGMA user_version; -- 获取或设置 用户版本整数的值

查询或更改当前数据库连接的上限限制的值。(针对3以上版本)

此限制设置允许准备好的语句启动以协助查询的辅助线程数的上限。默认限制为 0,除非使用SQLITE_DEFAULT_WORKER_THREADS 编译时选项进行更改。当限制为零时,这意味着不会启动辅助线程

PRAGMA threads;PRAGMA threads = N;查询或更改当前数据库连接的 sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...) 限制的值。此限制设置允许准备好的语句启动以协助查询的辅助线程数的上限。默认限制为 0,除非使用SQLITE_DEFAULT_WORKER_THREADS 编译时选项进行更改。当限制为零时,这意味着不会启动辅助线程。这个 pragma 是 sqlite3_limit (db, SQLITE_LIMIT_WORKER_THREADS ,...) 接口的薄包装。

查询数据库所有表信息

如创建表sql 、表名等等

SELECT * FROM sqlite_master WHERE type='table' ORDER BY name;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sqlite进阶之--附加数据库关联查询以及Pragma的相关使用 的相关文章

  • Mac 上的 GeoDjango 和 Spatialite:C 扩展加载问题

    我正在关注GeoDjango 教程 https docs djangoproject com en dev ref contrib gis tutorial 在我的家用计算机 运行 OSX 10 8 2 的 Mac Mini 上为我的项目设
  • 光标返回错误值 - sqlite - Android

    我正在开发一个短信应用程序 我正在尝试从每次对话中获取最后一条短信 这是我的 SQL 语句 SELECT MAX smsTIMESTAMP AS smsTIMESTAMP id smsID smsCONID smsMSG smsNUM sm
  • 从SQLite列中获取所有数字字符串并进行总和计算

    我是 Android 和 SQLite 的新手 我在 SQLite 中有一个只有数字的 AMOUNT 列 我可以在 ListView 中显示它 但我无法找到任何我理解的方法来将它们全部添加并显示在 TextView 中 这是数据库助手 im
  • Android 中表与游标的并集

    我正在尝试将两个具有相同字段的表合并起来 通过内容提供程序 创建一个用于创建 ListView 的游标 Override public Cursor query Uri uri String projection String select
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • SQLite FTS4 使用特殊字符进行搜索

    我有一个 Android 应用程序 它使用 FTS4 虚拟表在 SQLite 数据库中搜索数据 它工作正常 但是当表中的数据包含特殊字符 如 或 时 SQLite MATCH 函数不会给出任何结果 我现在迷路了 谢谢 注意 默认的分词器真的
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • 使用 Python 3 动态插入到 sqlite

    我想使用 sqlite 写入多个表 但我不想提前手动指定查询 有数十种可能的排列 例如 def insert sqlite tablename data list global dbc dbc execute insert into tab
  • SQLite支持android的数据类型有哪些

    谁能告诉我 SQLITE 中支持 ANDROID 的数据类型列表 我想确认 TIME 和 DATE 数据类型 这里有一个list http www sqlite org datatype3 htmlSQLite 的数据类型 支持时间和日期间
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • SQLiteException - 仅发生在某些设备上

    我最近向市场发布了一个应用程序 从开发者控制台来看 我的用户中大约有 1 2 遇到了这个问题 1 2 的比例很小 但人们更倾向于在某些内容不起作用时留下评论 而不是在它起作用时留下评论 这可能会对下载产生负面影响 不幸的是 开发人员控制台仅
  • 如何在 sqlite 中将 2 列合并为新列

    我有一个包含 3 列的表 我必须将 2 列中的值按降序排列到一列中 A B C z 1 2 f 5 7 s 9 5 使用此示例 输出会将 B 列和 C 列中的值放入其中 如下所示 A B s 9 f 7 f 5 s 5 z 2 z 1 我当
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • SQLite + SpatiaLite 问题

    我正在尝试使用 System Data SQLite 提供程序从 C 访问 SpatiaLite 当我尝试加载 SpatiaLite 扩展时 我总是得到 System Data SQLite SQLiteException SQLite e
  • 游标索引越界异常

    打开后出现光标索引越界错误 数据库 请任何人告诉我如何打开现有数据库 sqllite Android 我想在数据库上触发一个选择查询 检索一些信息 public void getPatient SQLiteDatabase db Strin
  • 从 sqlite 和 mysql 加载数据微调器

    我试试这个tutorial http nielpoenya blogspot com 2012 08 tutorial android spinner dari database html加载Spinner from sqlite and
  • 使用Python处理Sqlite数据库中的换行符“\n”?

    我有一个名为 test db 的 Sqlite 数据库 其中包含两个表 其结构如下 表 1 ID 整数主键自动增量 名称 varchar 500 颜色 varchar 500 表2 ID INTEGER PRIMARY KEY AUTOIN
  • 将自动递增值添加到只有一列的表中

    我需要创建一个基本上仅保留索引列表的表 因此 我创建了一个只有一个名为 id 的自动递增列的表 但是 我似乎无法隐式地将自动递增值添加到该表中 我知道通常当您在表中有这样一列 不仅仅是此列 时 您可以执行以下操作 插入表 col1 col2

随机推荐

  • Configure and build Mesa3D

    1 环境 Mesa3D 21 1 4 Mesa3D demos Ubuntu 20 04 2 配置环境 sudo apt install gcc sudo apt install g sudo apt install vim sudo ap
  • React-Native ERROR: JAVA_HOME is not set and no ‘java’ command could be found in your PATH.

    ERROR JAVA HOME is not set and no java command could be found in your PATH Please set the JAVA HOME variable in your env
  • React重点知识拓展,含Hooks、路由懒加载等

    第7章 React扩展 一 setState 1 setState更新状态的2种写法 setState stateChange callback 对象式的setState stateChange为状态改变的对象 该对象可以体现出状态的更改
  • 华为云原生之数据仓库服务GaussDB(DWS)的深度使用与应用实践

    一 GaussDB DWS 简介 什么是 GaussDB DWS 数据仓库服务 GaussDB DWS 是一种基于华为云基础架构和平台的在线数据处理数据库 提供即开即用 可扩展且完全托管的分析型数据库服务 GaussDB DWS 是基于华为
  • java内存工具VisualVM的简单使用以及与Idea集成

    一 idea集成 1 打开设置 windows File gt Setting MacOS Intelij Idea gt Preferences 1 2 打开插件仓库 Plugins gt Browers Repositrories 在这
  • SPI总线协议概述

    一 概述 SPI serial peripheral interface 是一种同步串行通信协议 由一个主设备和一个或多个从设备组成 主设备启动与从设备的同步通信 从而完成数据的交换 SPI是一种高速全双工同步通信总线 标准的SPI仅仅使用
  • 【Python】一个矩阵根据某一列选择大于或小于范围的数据

    data all data all data all 3 gt 54201 data all data all data all 3 lt 54220 上面就是根据数据的第3列 选取54201到54220的范围的数据
  • AD20的元件库及加载(一)

    开始时我们画的是元器件 元器件在后缀名为 的文件里画 以画电容为例 上图就是结果 画着简单 过程能学会很多 小伙伴们可能刚刚接触 不知道在哪找线 选择元器件不放 按住鼠标左键 并按下空格 即可旋转元器件的角度 每次旋转90度 电阻的两边的四
  • 福到了(15 分)

    L1 6 福到了 15 分 福 字倒着贴 寓意 福到 不论到底算不算民俗 本题且请你编写程序 把各种汉字倒过来输出 这里要处理的每个汉字是由一个 N N 的网格组成的 网格中的元素或者为字符 或者为空格 而倒过来的汉字所用的字符由裁判指定
  • 软件测试基础内容学习(二)之边界值分析法

    对限定边界规则设计测试点 边界值分析法 说明 1 边界范围节点 2 应用设计步骤 3 案例 4 适用场景 边界范围节点 选取正好等于 上点 刚好大于 刚好小于 离点 边界的值作为测试数据 内点 一般取最中间的点 在范围内的点 应用设计步骤
  • Python deque的用法介绍

    Python deque的用法介绍 deque 是Python标准库 collections 中的一个类 实现了两端都可以操作的队列 相当于双端队列 与Python的基本数据类型列表很相似 Python实现双端队列参考 https blog
  • JVM 一. 字节码与数据类型相关

    目录 一 字节码 数据类型相关 一 字节码 数据类型相关 字节码文件是跨平台的吗 是的 java虚拟机主要识别字节码文件 其实现在的java虚拟机已经不是单纯的java的 只要语言满足虚拟机的规范 都可以在这个虚拟机上运行 class文件中
  • 一、Kubernetes系列之介绍篇

    Kubernetes介绍 1 背景介绍 云计算飞速发展 IaaS PaaS SaaS Docker技术突飞猛进 一次构建 到处运行 容器的快速轻量 完整的生态环境 2 什么是kubernetes 首先 他是一个 全新的基于容器技术的分布式架
  • 微信回调模式配置企业服务器URL

    转载请标明出处 尊重他人劳动成果 谢谢 前几天微信推出了企业号 我就进去关注了一下 发现用途大大的多 就顺手整了一个测试号来试试 由于是新出的玩意儿 很多东西有文档也不到一定知道整 我这个配置就花了蛮久才找到失败的原因 最终是借用了浩然哥的
  • STL——queue模板类常见函数

    include
  • 【Python数据分析】Pandas按行遍历Dataframe

    Pandas按行遍历Dataframe的方法主要有两种 iterrows 和itertuples 具体用法如下 构建数据集 import pandas as pd import numpy as np N 20 dataset pd Dat
  • 08C++11多线程编程之unique_lock类模板

    08C 11多线程编程之unique lock类模板 前述 如果看懂了该篇文章 你对unique lock可以说随便使用 并且可以只看第5点的总结即可 1 unique lock概念 当不加参数时 和lock guard一样能自动上锁解锁
  • Unity 实现选框选中物体

    最近在看RTS游戏视频注意到了选框功能 就尝试做了一下 功能实现 脚本挂载到Camera上 要不然OnPostRender 函数无法调用 rectMat新建一个材质球 设置成默认的Sprites就可以了 using System Colle
  • Vue的安装和部署

    1 下载安装node js 官网下载地址 https nodejs org en 如果C盘较小 可以自定义安装到其他盘 解压完的目录如下 2 node v npm v 能看到版本号说明安装成功 3 在安装目录下 创建全局安装目录 node
  • Sqlite进阶之--附加数据库关联查询以及Pragma的相关使用

    数据库连接 基本的 Data Source c mydb db Version 3 此类库不支持版本 2 内存数据库 Data Source memory Version 3 New True SQLite 数据库通常存储在磁盘上 但数据库