You need to enable JavaScript to run this app.
导航
DETACH语句 (DETACH)
最近更新时间:2025.08.14 10:17:09首次发布时间:2025.05.07 15:04:15
复制全文
我的收藏
有用
有用
无用
无用

DETACH 语句用于将表、物化视图、字典或数据库从服务器中分离,不会删除其数据或元数据。

语法

DETACH TABLE|VIEW|DICTIONARY|DATABASE [IF EXISTS] [db.]name  [PERMANENTLY] [SYNC] 

执行分离操作后,对于数据的影响如下:

  1. 临时分离(默认):服务器重启时会自动重新加载元数据并识别实体。
  2. 永久分离PERMANENTLY):服务器重启后不会自动识别,需手动执行 ATTACH 重新附加。
  3. 所有分离的实体(无论是否永久分离)均可通过 ATTACH 语句重新附加。系统日志表,例如 query_log、text_log 等,也可以重新附加支持,但其他系统表不支持重新附加。
  4. 执行临时分离操作后,处于分离状态的表无法直接永久分离,需先执行 ATTACH 重新附加后,方可再次进行永久分离操作。
  5. 限制
    • 永久分离的表会阻止同名表创建或 RENAME 操作。
    • 已分离的表无法直接删除或永久分离,需先重新附加。

参数说明

参数

是否必填

含义与作用

TABLE

VIEW

DICTIONARY

IF EXISTS

当对象不存在时不报错,跳过操作。

[db.]name

指定对象所属数据库(可选)和名称。未指定数据库时使用当前数据库。

PERMANENTLY

永久分离实体。服务器重启后不会自动恢复元数据。
彻底移除元数据(包括表结构、权限等),仅保留物理数据。服务器重启后不会自动恢复元数据,需手动重建。

SYNC

立即同步执行操作,未指定时,默认异步。

示例

  1. 创建表。

    -- 1. 创建库
    CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster;
    
    -- 2. 创建表
    DROP TABLE IF EXISTS sample_db.sample_detach ON CLUSTER sample_cluster;
    CREATE TABLE sample_db.sample_detach ON CLUSTER sample_cluster (
      id Int64
    ) 
    ENGINE = MergeTree() 
    ORDER BY id;
    
    -- 3. 插入测试数据
    INSERT INTO sample_db.sample_detach SELECT number FROM numbers(10);
    
    -- 4. 查询表中数据
    SELECT * FROM sample_db.sample_detach;
    
    ┌─number─┐
    │      0  │
    │      1  │
    │      2  │
    │      3  │
    │      4  │
    │      5  │
    │      6  │
    │      7  │
    │      8  │
    │      9  │
    └─────┘
    
  2. 分离一张表并查询该表。

    DETACH TABLE sample_db.sample_detach;
    
    SELECT * FROM sample_db.sample_detach; 
    

    输出结果如下,表示表已分离:

    Code: 60, e.displayText() = DB::Exception: Table sample_db.sample_detach doesn't exist SQLSTATE: 42P01 (version 21.9.1)