Skip to content

SQLite - 分离数据库

DETACH DATABASE 命令用于将先前附加(attached)的数据库从当前数据库连接中分离(disconnect)。每个附加的数据库都通过一个别名(alias)标识,DETACH 命令使用此别名来指定要分离的数据库。

你不能分离默认的 main 或 temp 数据库。如果一个数据库文件使用多个别名附加,分离其中一个别名不会影响其他别名。如果被分离的数据库是内存数据库,它将被销毁,其数据将永久丢失。

该语法需要 ATTACH DATABASE 语句中使用的别名。

DETACH DATABASE 'Alias-Name';

让我们来看一个完整的附加和分离周期。首先,我们将创建两个独立的数据库文件。

-- 在你的终端中:
$ sqlite3 main.db "CREATE TABLE t1 (id INT); INSERT INTO t1 VALUES (1);"
$ sqlite3 reporting.db "CREATE TABLE reports (report_id INT); INSERT INTO reports VALUES (101);"

现在,让我们用 main.db 开始一个会话,并查看其过程。

$ sqlite3 main.db
-- 步骤 1:检查初始数据库连接
sqlite> .databases
seq name file
--- --------------- --------------------------
0 main /path/to/main.db
-- 步骤 2:使用别名 'reports_db' 附加 reporting 数据库
sqlite> ATTACH DATABASE 'reporting.db' AS reports_db;
-- 步骤 3:验证数据库是否已附加
sqlite> .databases
seq name file
--- --------------- --------------------------
0 main /path/to/main.db
2 reports_db /path/to/reporting.db
-- 现在你可以跨数据库查询
sqlite> SELECT * FROM main.t1, reports_db.reports;
id report_id
-- ---------
1 101
-- 步骤 4:分离 reporting 数据库
sqlite> DETACH DATABASE 'reports_db';
-- 步骤 5:检查最终状态。连接已断开。
sqlite> .databases
seq name file
--- --------------- --------------------------
0 main /path/to/main.db
-- 现在尝试查询已分离的数据库将导致错误
sqlite> SELECT * FROM reports_db.reports;
Error: no such table: reports_db.reports