附加共享数据库( ATTACH DATABASE)的使用场景
附加共享数据库(使用 ATTACH DATABASE)的功能非常实用,通常会在以下几种场景下需要用到:
1. 跨数据库查询和分析
场景:
你的公司有两个独立的数据库:
- 一个存储了学生信息 (
school.db) - 一个存储了员工信息 (
company.db)
你需要找出同时存在两个数据库中的人,比如既是学生又是员工的人。
解决方式:
通过附加共享数据库,你可以在同一个 SQLite 实例中跨两个数据库执行查询:
-- 打开主数据库
sqlite3 school.db-- 附加共享数据库
ATTACH DATABASE 'company.db' AS shared;-- 查询跨数据库的信息
SELECT s.name
FROM main.students s
JOIN shared.employees e
ON s.name = e.name;
意义:
- 不需要额外导出、转换或合并数据,可以直接跨数据库操作。
- 提高了多数据源查询和分析的效率。
2. 数据迁移
场景:
你需要将旧系统的数据迁移到新系统,比如:
old_system.db存储了旧系统中的订单数据。new_system.db是新系统的空白数据库。
解决方式:
可以通过附加共享数据库来实现数据迁移:
-- 打开新系统数据库
sqlite3 new_system.db-- 附加旧系统数据库
ATTACH DATABASE 'old_system.db' AS old;-- 将旧系统数据插入到新系统中
INSERT INTO main.orders (id, customer, total)
SELECT id, customer, total
FROM old.orders;
意义:
- 无需外部工具即可完成迁移。
- 保证了迁移过程的方便性和一致性。
3. 合并数据
场景:
你有多个部门的独立数据库,每个数据库存储了一部分数据,比如:
department1.db中存储了部门 1 的数据。department2.db中存储了部门 2 的数据。
你需要将所有部门的数据合并到一个总表中。
解决方式:
-- 打开总数据库
sqlite3 all_departments.db-- 附加各部门的数据库
ATTACH DATABASE 'department1.db' AS dep1;
ATTACH DATABASE 'department2.db' AS dep2;-- 合并数据到总数据库
INSERT INTO main.employees (id, name, department)
SELECT id, name, 'Department 1'
FROM dep1.employees;INSERT INTO main.employees (id, name, department)
SELECT id, name, 'Department 2'
FROM dep2.employees;
意义:
- 快速整合分散在多个数据库中的数据。
- 保证合并过程的一致性和准确性。
4. 只读共享数据
场景:
你的团队中有一个共享数据库 shared_data.db,存储了所有人的公共参考数据,比如邮政编码表、国家列表等。
而你的项目数据库 project.db 中存储了自己的业务数据。
解决方式:
通过附加共享数据库,你可以访问这些参考数据,而无需将它复制到项目数据库中:
-- 打开项目数据库
sqlite3 project.db-- 附加共享数据库
ATTACH DATABASE 'shared_data.db' AS shared;-- 查询共享数据中的国家列表
SELECT * FROM shared.countries;
意义:
- 避免重复存储相同的数据,节省存储空间。
- 确保共享数据的统一性和实时性。
5. 数据库分片管理
场景:
一个数据库因为数据量过大,被拆分为多个小数据库,每个小数据库管理一部分数据。
比如:
users_part1.db:存储用户 ID 从 1 到 10,000。users_part2.db:存储用户 ID 从 10,001 到 20,000。
你需要对所有用户数据进行统计分析。
解决方式:
通过附加多个共享数据库,轻松进行跨分片查询:
-- 打开主数据库
sqlite3 users_analysis.db-- 附加多个分片数据库
ATTACH DATABASE 'users_part1.db' AS part1;
ATTACH DATABASE 'users_part2.db' AS part2;-- 统计所有用户的总数
SELECT COUNT(*) AS total_users
FROM part1.users
UNION ALL
SELECT COUNT(*)
FROM part2.users;
意义:
- 让大规模数据的管理和操作更加灵活。
- 支持分片存储的数据库结构。
总结
共享数据库适用于以下场景:
- 跨数据库查询和分析(比如学生与员工的对比)。
- 数据迁移(从旧系统迁移到新系统)。
- 数据合并(将多个部门的独立数据库合并为一个)。
- 只读共享数据(使用公共参考数据)。
- 数据库分片管理(对大数据进行分片存储和查询)。
通过附加其他架构(共享数据库),SQLite 提供了非常强大的多数据库协作能力,帮助用户高效管理和操作多个数据源!
这里用数据库分片管理举例说明:
你提供的 SQL 示例展示了如何使用 SQLite 的 ATTACH DATABASE 命令附加多个分片数据库,并在这些数据库中进行查询操作。以下是对代码的详细解读:
代码详解
-
打开主数据库
sqlite3 users_analysis.db- 启动 SQLite 并打开一个主数据库
users_analysis.db。 - 主数据库可以用于存储最终的统计结果或执行查询的入口。
- 启动 SQLite 并打开一个主数据库
-
附加分片数据库
ATTACH DATABASE 'users_part1.db' AS part1; ATTACH DATABASE 'users_part2.db' AS part2;ATTACH DATABASE用于加载额外的数据库文件(即分片数据库)。AS part1和AS part2为附加数据库指定别名,后续查询中可以通过别名访问对应数据库中的表。
-
统计用户总数
SELECT COUNT(*) AS total_users FROM part1.users UNION ALL SELECT COUNT(*) FROM part2.users;COUNT(*):统计每个数据库中users表的用户总数。UNION ALL:将两个查询结果合并在一起。- 如果使用
UNION(无ALL),则会去除重复的结果,但在统计用户数量时通常需要保留重复。
- 如果使用
-
结果解读
查询结果将返回两行数据,每行分别对应users_part1.db和users_part2.db中的用户数量。
改进:统计所有用户总和
如果你需要直接统计所有分片的用户总数,可以使用 SUM 函数:
SELECT SUM(user_count) AS total_users
FROM (SELECT COUNT(*) AS user_count FROM part1.usersUNION ALLSELECT COUNT(*) AS user_count FROM part2.users
);
改进后的效果:
- 内层查询统计每个分片的用户数。
- 外层通过
SUM聚合内层查询的结果,得出所有用户的总数。
场景分析
这种方式适合**分片数据库(Sharded Database)**的应用场景:
- 分片存储: 数据库被拆分成多个文件,每个文件存储不同的子集数据,例如按照用户 ID、地理位置等划分。
- 查询效率: 将不同的分片附加到同一会话中,便于集中查询和分析。
- 大数据场景: 当单个数据库文件过大时,分片存储可以降低单个数据库的负担。
示例运行结果
假设分片数据库中的用户表如下:
part1.users
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
part2.users
| id | name |
|---|---|
| 3 | Charlie |
| 4 | David |
| 5 | Emma |
执行结果:
查询 1:原代码(分开统计)
total_users
-----------
2
3
查询 2:改进代码(总和统计)
total_users
-----------
5
通过这种方式,可以轻松整合和分析多个分片数据库的数据。
相关文章:
附加共享数据库( ATTACH DATABASE)的使用场景
附加共享数据库(使用 ATTACH DATABASE)的功能非常实用,通常会在以下几种场景下需要用到: 1. 跨数据库查询和分析 场景: 你的公司有两个独立的数据库: 一个存储了学生信息 (school.db)一个存储了员工信息 …...
matlab的绘图的标题中(title)添加标量以及格式化输出
有时候我们需要在matlab绘制的图像的标题中添加一些变量,这样在修改某些参数后,标题会跟着一块儿变。可以采用如下的方法: x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…...
2、第一个GO 程序
引言 接下里我们就用Go Land 工具,开发第一个GO程序。大家也可以用其他的开发工具,例如 Vs Code 1、新建项目 第一个是选择你的程序保存位置 (不要有中文)。 第二个是你的Go的编译器的安装地址。 选择完毕后,就点击 …...
【Linux-多线程】-线程安全单例模式+可重入vs线程安全+死锁等
一、线程安全的单例模式 什么是单例模式 单例模式是一种“经典的,常用的,常考的”设计模式 什么是设计模式 IT行业这么火,涌入的人很多.俗话说林子大了啥鸟都有。大佬和菜鸡们两极分化的越来越严重,为了让菜鸡们不太拖大佬的后…...
00000007_C语言设计模式
C语言设计模式 尽管 C 语言并不直接支持面向对象编程,但通过结构体和函数指针的灵活运用,我们依然可以实现多种经典的设计模式。 1. 工厂模式 1.1 工厂方法的定义与实现 工厂模式通过统一的接口创建对象,客户端无需知道具体的创建逻辑。 代…...
探索数据存储的奥秘:深入理解B树与B+树
key value 类型的数据红黑树(最优二叉树,内存最优),时间复杂度:O(logn),调整方便;一个结点分出两个叉B树一个节点可以分出很多叉数据量相等的条件下:红黑树的层数很高&am…...
Web渗透测试之XSS跨站脚本之JS输出 以及 什么是闭合标签 一篇文章给你说明白
目录 闭合标签 XSS之js输出 闭合标签 封闭标签 达到 让标签值不当成 一个属性值来展示 从而达到xss注入的效果 "> 为了想办法闭合前面的标签,不用也行成功率高一些 攻击方法 "><script>confirm(1)</script>, 其中 "> 我们称之为完成闭合…...
EasyExcel的应用
一、简单使用 引入依赖: 这里我们可以使用最新的4.0.2版本,也可以选择之前的稳定版本,3.1.x以后的版本API大致相同,新的版本也会向前兼容(3.1.x之前的版本,部分API可能在高版本被废弃)&…...
VS Code的设置功能以及多层级的设置方式与解密
VS Code的Settings功能为用户提供了极大的灵活性和便利性,使得用户可以根据自己的需求和偏好来定制编辑器的行为和外观。 Settings 可以实现的具体功能 VS Code的设置项非常丰富,涵盖了各个方面,包括但不限于: 编辑器选项&…...
UI自动化测试框架playwright--初级入门
一、背景:UI自动化的痛点: 1、设计脚本耗时: 需要思考要如何模拟用户的操作,如何触发页面的事件,还要思考如何设计脚本,定位和操作要交互的元素、路径、位置,再编写代码逻辑,往复循…...
SQL多表联查、自定义函数(字符串分割split)、xml格式输出
记录一个报表的统计,大概内容如下: 多表联查涉及的报表有:房间表、买家表、合同表、交易表、费用表、修改记录表 注意:本项目数据库使用的是sqlserver(mssql),非mysql。 难点1:业主信息&#…...
Fast API使用
相关的代码上都有注释,其中前端代码是用来提交表单的 此代码进行了跨域处理,允许前端直接提交表单,并正常返回 完整代码: from typing import Unionfrom fastapi import Header, Cookie from pydantic import BaseModel, Field f…...
LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型,包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型,支持…...
MySQL 中删除重复数据 SQL 写法
要在 MySQL 中删除重复的数据并只保留一条,可以使用下面的方法(要用的时候直接复制小改下条件和表名称即即可) 方法一:使用 left join 子查询删除重复数据(推荐) 温馨提示:本人在 500w 数据下执行此 SQL 耗费 15s-30s…...
docker minio镜像arm64架构
minio版本为RELEASE.2021-09-03T03-56-13Z 原项目信创改造,服务器资源改为了arm64架构,统信uos docker镜像库内没有对应的minio镜像,当前镜像为拉取源码后,自编译打包镜像,亲测可用。 使用方式 将tar包导入到服务器…...
VUE3 监听器(watch)
在 Vue 3 中,监听器(watch)是用来观察响应式数据的变化,并在数据发生变化时执行相应操作的机制。watch 主要用于响应式数据变化时的副作用处理,比如异步操作、数据更新等。 1. 基础使用 在 Vue 3 中,watc…...
CAPL如何设置TCP/IP传输层动态端口范围
在TCP/IP协议中,应用程序通过传输层协议TCP/UDP传输数据,接收方传输层收到数据后,根据传输层端口号把接收的数据上交给正确的应用程序。我们可以简单地认为传输层端口号是应用程序的标识,这就是为什么我们说应用程序在使用TCP/IP协议通信时要打开传输层端口号或者绑定端口号…...
随记:有关Springboot项目中的时间格式实现的几种方式
1.注解 JsonFormat DateTimeFormat import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDateTime;public class Event {// 序列化和反序列化时生效JsonFormat(pattern "yyyy-MM…...
IntelliJ IDEA 优化设置
针对 Java 开发,IntelliJ IDEA 有许多优化设置,可以帮助提高代码编写、调试、构建和运行的效率。以下是一些针对 Java 开发的优化建议: 1. 增加 JVM 内存和性能优化 增加堆内存: 通过调整 idea.vmoptions 文件,增加 IntelliJ ID…...
jsp企业财务管理系统设计与实现
企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用,企业发展速度在不断加快,在这种市场竞争冲击下企业财务管理系统必须优先发展,这样才能保证在竞争中处于优势地位。对此企业必须实现财务管理…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
