> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ATTACH 参考文档

# ATTACH 语句

用于附加表或字典，例如在将数据库迁移到另一台服务器时。

**语法**

```sql theme={null}
ATTACH TABLE|DICTIONARY|DATABASE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ...
```

该查询不会在磁盘上创建数据，而是假定数据已经位于适当的位置，只是将指定表、字典或数据库的信息添加到服务器中。执行 `ATTACH` 查询后，服务器就会识别该表、字典或数据库的存在。

如果某个表此前已被分离 ([DETACH](/zh/reference/statements/detach) 查询) ，也就是说其结构已知，则可以使用简写形式，而无需定义结构。

<div id="attach-existing-table">
  ## 附加现有表
</div>

**语法**

```sql theme={null}
ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
```

此查询会在服务器启动时使用。服务器会将表元数据存储为包含 `ATTACH` 查询的文件，并在启动时直接执行这些查询 (部分系统表除外，这些系统表会在服务器上显式创建) 。

如果该表已被永久分离，服务器启动时就不会重新附加它，因此你需要显式使用 `ATTACH` 查询。

<div id="create-new-table-and-attach-data">
  ## 创建新表并附加数据
</div>

<div id="with-specified-path-to-table-data">
  ### 使用指定的表数据路径
</div>

该查询会使用给定的结构创建一个新表，并将 `user_files` 中指定目录里的表数据附加到该表。

**语法**

```sql theme={null}
ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...)
```

**示例**

```sql title="Query" theme={null}
DROP TABLE IF EXISTS test;
INSERT INTO TABLE FUNCTION file('01188_attach/test/data.TSV', 'TSV', 's String, n UInt8') VALUES ('test', 42);
ATTACH TABLE test FROM '01188_attach/test' (s String, n UInt8) ENGINE = File(TSV);
SELECT * FROM test;
```

```sql title="Response" theme={null}
┌─s────┬──n─┐
│ test │ 42 │
└──────┴────┘
```

<div id="with-specified-table-uuid">
  ### 使用指定表 UUID
</div>

此查询会使用给定的结构创建一个新表，并附加具有指定 UUID 的表中的数据。
该功能由 [Atomic](/zh/reference/engines/database-engines/atomic) 数据库引擎支持。

**语法**

```sql theme={null}
ATTACH TABLE name UUID '<uuid>' (col1 Type1, ...)
```

<div id="attach-mergetree-table-as-replicatedmergetree">
  ## 将 MergeTree 表附加为 ReplicatedMergeTree
</div>

允许将非复制的 MergeTree 表附加为 ReplicatedMergeTree。创建的 ReplicatedMergeTree 表将使用 `default_replica_path` 和 `default_replica_name` 设置的值。也可以将复制表附加为普通 MergeTree 表。

请注意，此查询不会影响 ZooKeeper 中该表的数据。这意味着在执行 attach 后，你必须使用 `SYSTEM RESTORE REPLICA` 在 ZooKeeper 中添加元数据，或者使用 `SYSTEM DROP REPLICA ... FROM ZKPATH ...` 将其清除。

如果你尝试为现有的 ReplicatedMergeTree 表添加副本，请注意，转换后的 MergeTree 表中的所有本地数据都会变为 detached 状态。

**语法**

```sql theme={null}
ATTACH TABLE [db.]name AS [NOT] REPLICATED
```

**将表转换为副本表**

```sql theme={null}
DETACH TABLE test;
ATTACH TABLE test AS REPLICATED;
SYSTEM RESTORE REPLICA test;
```

**将表转换为非复制表**

获取表的 ZooKeeper 路径和副本名称：

```sql title="Query" theme={null}
SELECT replica_name, zookeeper_path FROM system.replicas WHERE table='test';
```

```sql title="Response" theme={null}
┌─replica_name─┬─zookeeper_path─────────────────────────────────────────────┐
│ r1           │ /clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1 │
└──────────────┴────────────────────────────────────────────────────────────┘
```

将表作为非复制表附加，并从 ZooKeeper 中删除副本数据：

```sql title="Query" theme={null}
DETACH TABLE test;
ATTACH TABLE test AS NOT REPLICATED;
SYSTEM DROP REPLICA 'r1' FROM ZKPATH '/clickhouse/tables/401e6a1f-9bf2-41a3-a900-abb7e94dff98/s1';
```

<div id="attach-existing-dictionary">
  ## 附加现有字典
</div>

将先前处于 `分离` 状态的字典重新附加。

**语法**

```sql theme={null}
ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
```

<div id="attach-existing-database">
  ## 附加现有数据库
</div>

将先前已分离的数据库重新附加。

**语法**

```sql theme={null}
ATTACH DATABASE [IF NOT EXISTS] name [ENGINE=<database engine>] [ON CLUSTER cluster]
```
