【问题标题】:How to Merge Multiple Database files in SQLite?如何在 SQLite 中合并多个数据库文件?
【发布时间】:2011-02-06 12:46:33
【问题描述】:

我有多个数据库文件,它们存在于多个位置,结构完全相同。我了解附加功能可用于将多个文件连接到一个数据库连接,但是,这会将它们视为单独的数据库。我想做类似的事情:

SELECT uid, name FROM ALL_DATABASES.Users;

还有,

SELECT uid, name FROM DB1.Users UNION SELECT uid, name FROM DB2.Users ;

不是一个有效的答案,因为我需要合并任意数量的数据库文件。最后,数据库文件必须保持独立。有谁知道如何做到这一点?

编辑:一个答案给了我一个想法:是否可以创建一个组合所有不同表的视图?是否可以查询所有数据库文件以及它们“挂载”哪些数据库,然后在视图查询中使用它来创建“主表”?

【问题讨论】:

  • 为什么您不愿意在查询中在客户端逻辑组合表对象(而不是数据库文件)?如果您愿意指定要合并的数据库文件(本周可能是 5 个,但下周可能是 7 或 3 个),为什么不能只在查询中这样做?
  • 其原因是其他文件位于远程服务器上,这些服务器可能启动也可能未启动。我已经有了一个抽象,可以让它们看起来是本地文件。此外,它们包含本地数据库的不同但不是必需的数据。本质上,我将所有数据库汇集起来形成一个分布式数据库(尽管我对使用该术语犹豫不决,因为数据库的使用方式与名称所暗示的完全不同,而且我也不想要分布式数据库解决方案,因为文件已经本地化,它只会使事情复杂化)。

标签: sql sqlite multiple-databases


【解决方案1】:

由于 SQLite 对一次可以附加的数据库数量施加了限制,因此无法在单个查询中完成您想要的操作。

如果可以保证数量在 SQLite 的限制范围内(这违反了“任意”的定义),那么没有什么可以阻止您在需要执行时使用正确的 UNIONs 集生成查询它。

要支持真正任意数量的表,您唯一真正的选择是在不相关的数据库中创建一个表,并从每个候选者重复INSERT 行:

ATTACH DATABASE '/path/to/candidate/database' AS candidate;
INSERT INTO some_table (uid, name) SELECT uid, name FROM candidate.User;
DETACH DATABASE candidate;

【讨论】:

  • 除了附加表格的限制(我的意思是随时间变化的数字,介于 1 和附加表格的最大数量之间)有没有办法使编辑成为可能?
  • 当然。附加所有数据库并生成多UNION 查询。没有法律规定必须提前将查询硬编码到您的程序中。如果您要使用视图执行此操作,则必须以相同的方式生成 CREATE VIEW
  • 您是说代码需要查询附加的 dbfile 的数量,然后相应地调整其查询。这对于用户程序来说可能非常烦人,因为 UNION 不能总是以明显的方式完成。例如,由于两个数据库是分开的,所以主键会分别递增,这意味着可以有两个不同的记录具有相同的主键。因此,我认为所有这些复杂性都可以隐藏在视图后面,然后让代码具有更简单的查询,因为它不需要担心多文件抽象。
  • 如果您的主键有重叠,您仍然需要想出一种新方法来唯一标识组合版本中的每一行。那是一个不同的问题。无论如何,没有办法让 SQLite 自动组合每个附加数据库中的表 x。在某些时候,您必须知道以什么名称附加了哪些数据库并生成查询以将它们组合起来。甚至甲骨文都不会这样做。
【解决方案2】:

架构中的一些巧妙之处可以解决这个问题。

您通常会有两种类型的表:引用表和动态表。 参考表在所有数据库中具有相同的内容,例如国家代码、部门代码等。

动态数据是每个数据库唯一的数据,例如时间序列、销售统计等。

参考数据应保存在主数据库中,并在更改后复制到动态数据库中。

动态表都应该有一个 DB_ID 列,这将是复合主键的一部分,例如,您的时间序列可能使用 db_id、measurement_id、time_stamp。您还可以使用 DB_ID 上的哈希来生成主键,对 DB 中的所有表使用相同的 pk 生成器。当合并来自不同 DBS 的这些数据时,数据将是唯一的。

因此您将拥有 3 种类型的数据库:

  • 参考主机 -> 复制到所有其他人

  • 单个动态 -> 复制到全动态

  • 完全动态 -> 从参考主服务器和所有单独的动态复制。

然后,由您决定如何进行这种复制,伪实时或蛮力,每天或根据需要截断和重建完整的动态。

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多