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的相关使用 的相关文章

  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • 本地 SQLite 与远程 MongoDB

    我正在设计一个新的 Web 项目 在研究了一些旨在可扩展性的选项后 我提出了两个数据库解决方案 为可扩展方式精心设计的本地 SQLite 文件 每个 X 用户一个新的数据库文件 因为写入将取决于用户内容 不存在跨用户数据依赖性 远程 Mon
  • 在 SQLite 数据库的特定位置插入一行

    我正在 SQLite Manager 中创建数据库 并且错误地忘记提及一行 现在 我想在中间手动添加一行 在其下方 其余的自动增量键应自动增加 1 我希望我的问题很清楚 Thanks 您不应该关心键值 只需在末尾附加行即可 如果您确实需要这
  • 带外键或不带外键的引用有什么区别

    关于SQLite 带外键或不带外键的引用有什么区别 这有什么区别 CREATE TABLE players set id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL player id INTEGE
  • #pragma init 和 #pragma fini 在 Linux 上使用 gcc 编译器

    我想构建一些代码 在加载共享库时调用一些代码 我想我会这样做 pragma init my init static void my init do something int add int a int b return a b 所以当我用
  • 在 Google App Engine 中使用 sqlite3?

    我正在尝试将我的 Python Django 项目部署到 Google App Engine 现在它在我的本地计算机上运行良好 但是当我尝试将其作为 Google App Engine 中的项目运行时 出现以下错误 ImproperlyCo
  • SQLite 更新很多行非常慢

    我相信我已经使用了很多方法来加速许多行的更新 但到目前为止没有任何帮助 我们正在开立交易 像这样 private SQLiteTransaction BeginTransaction SQLiteConnection connection
  • 使用 SQLite.Net.Async 的 Xamarin.Forms

    我已按照此处的说明进行操作http developer xamarin com guides cross platform xamarin forms working with databases http developer xamari
  • sqlite android 中的波斯语/阿拉伯语搜索给出了错误的结果

    我的 sqlite 数据库有问题 它似乎不支持完整的波斯 阿拉伯字符 当我根据波斯字符搜索某些字段时 大多数时候 Sqlite 无法识别这些字符 我通过从 HTML 文件复制数据将数据插入数据库 所以当我输入字符串并搜索时 没有结果显示 但
  • SQL - 我需要将总值划分为另一个表中的多行

    假设我在 SQL Server 2008 中有以下表 学校桌 School Id Course Id Total Students 1 Acct101 150 1 Acct102 100 2 Acct101 110 2 Acct102 13
  • 如何将 GCC 诊断编译指示与 C++ 模板函数一起使用?

    我想使用 g 和 Werror 所以我现在必须禁用我无法控制的第三方库的警告 提供的解决方案http gcc gnu org onlinedocs gcc Diagnostic Pragmas html http gcc gnu org o
  • 在 Python 中使用 SQLCipher - 最简单的方法 [重复]

    这个问题在这里已经有答案了 我正在编写一个可以在加密的 SQLite 数据库上运行的 Python 实用程序 最终我会将此类实用程序转换为可执行文件 以便更轻松地交付给团队的其他成员 我读了很多关于 SQLCipher 的页面 但他们都谈论
  • Laravel - 调用未定义的方法 Illuminate\Database\Query\Builder::user()

    我正忙于Laravel 从头开始 更新记录和预加载 https laracasts com series laravel 5 from scratch episodes 10 我已经遵循了该教程 但在尝试在 CardsController
  • Android SQLite 按 utf8 整理/排序

    我在 Android 上的 SQLite 表中有以下项目 平板电脑选项卡有 1 列 名称 文本 Beta Work pal User 如果我在 SQL Server 中有这些项目 并带有斯洛伐克语的排序规则 并且select from ta
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 数据库锁定在 WAL 模式下,只有读取器

    在中使用System Data Sqlite 1 0 86 0 包括SQLite 3 7 17 预写式记录 http www sqlite org wal html模式下 我在并发读取时遇到数据库锁 如果我正确理解 WAL 则不应该出现这种
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • “库例程调用不按顺序” sqlite3_prepare_v2(CREATE TABLE)

    你知道为什么我打电话时会收到 Library Routine Called Out Of Sequence 吗 sqlite3 prepare v2 CREATE TABLE 在空数据库上 我创建一个空数据库 然后打开它 后来我将所有必须写

随机推荐

  • 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 数据库通常存储在磁盘上 但数据库