5

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

SELECT uid, name FROM ALL_DATABASES.Users;

还,

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

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

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

4

2 回答 2

6

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

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

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

ATTACH DATABASE '/path/to/candidate/database' AS candidate;
INSERT INTO some_table (uid, name) SELECT uid, name FROM candidate.User;
DETACH DATABASE candidate;
于 2011-02-06T13:45:07.377 回答
0

模式中的一些聪明之处会解决这个问题。

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

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

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

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

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

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

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

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

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

于 2014-01-25T18:13:20.217 回答