1.概述
attach-stmt:
expr:
过滤器子句:
literal-value:
over-clause:
frame-spec:
ordering-term:
raise-function:
select-stmt:
common-table-expression:
compound-operator:
join-clause:
join-constraint:
join-operator:
ordering-term:
result-column:
table-or-subquery:
type-name:
signed-number:
ATTACH DATABASE语句将另一个数据库文件添加到当前数据库连接中。可以使用DETACH DATABASE命令删除以前附加的数据库文件。
2.细节
要附加的数据库的文件名是在AS关键字之前出现的表达式的值。数据库的文件名与sqlite3_open()和sqlite3_open_v2()的filename参数具有相同的语义;特殊名称“ :memory: ”将导致内存数据库,而空字符串将导致新的临时数据库。如果在数据库连接上启用了URI文件名处理,则filename参数可以是URI文件名。默认行为是禁用URI文件名,但是在将来的SQLite版本中可能会更改,因此建议应用程序开发人员进行相应的计划。
在AS关键字之后出现的名称是SQLite内部使用的数据库的名称。模式名称“ main”和“ temp”是指主数据库以及用于临时表的数据库。主数据库和临时数据库无法连接或分离。
可以使用语法schema-name.table-name引用附加数据库中的表
。如果表名在所有附加数据库以及主数据库和临时数据库中都是唯一的,则
不需要架构名称前缀。如果不同数据库中的两个或多个表具有相同的名称,并且
表引用未使用schema-name前缀,则所选表是数据库中最近连接的表。
假设主数据库不是“ :memory: ”并且
journal_mode不是WAL,则涉及多个附加数据库的事务是原子的。如果主数据库是“:memory:”或journal_mode是WAL,则事务在每个单独的数据库文件中继续是原子的。但是,如果主机在更新两个或多个数据库文件的COMMIT中间崩溃,则其中一些文件可能会获得更改,而其他文件可能没有。
使用sqlite3_limit()和
SQLITE_LIMIT_ATTACHED设置了一个限制,该限制是可以同时附加到单个数据库连接的数据库数量。