> ## 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.

> Alias 表引擎可作为另一张表的透明代理。所有操作都会转发到目标表，而别名本身不存储任何数据。

# Alias 表引擎

export const ExperimentalBadge = () => {
  return <div className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Experimental feature. <u><a href="/docs/beta-and-experimental-features#experimental-features">Learn more.</a></u>
        </div>;
};

`Alias` 引擎会为另一张表创建一个代理。所有读写操作都会转发到目标表，而别名本身不存储任何数据，只保留对目标表的引用。

<Info>
  这是一项 Experimental 功能，未来的发行版中可能会发生不兼容旧版本的变更。
  通过 [allow\_experimental\_alias\_table\_engine](/zh/reference/settings/session-settings#allow_experimental_alias_table_engine) 设置
  启用 Alias 表引擎。
  输入命令 `set allow_experimental_alias_table_engine = 1`。
</Info>

<div id="creating-a-table">
  ## 创建表
</div>

```sql theme={null}
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_table)
```

或者显式指定数据库名称：

```sql theme={null}
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_db, target_table)
```

<Note>
  `Alias` 表不支持显式定义列。列会自动继承自目标表。这可确保该别名始终与目标表的 schema 保持一致。
</Note>

<div id="engine-parameters">
  ## 引擎参数
</div>

* **`target_db (optional)`** — 包含目标表的数据库名称。
* **`target_table`** — 目标表名称。

<Note>
  如果省略 `target_db`，且 `target_table` 不是完全限定名称 (例如 `Alias('my_table')`) ，则目标会解析为与别名本身相同的数据库，而不是当前会话所在的数据库。
</Note>

<div id="supported-operations">
  ## 支持的操作
</div>

`Alias` 表引擎支持所有主要操作。

<div id="operations-on-target">
  ### 目标表上的操作
</div>

以下操作会透传到目标表：

| 操作                           | 支持 | 说明                               |
| ---------------------------- | -- | -------------------------------- |
| `SELECT`                     | ✅  | 从目标表读取数据                         |
| `INSERT`                     | ✅  | 向目标表写入数据                         |
| `INSERT SELECT`              | ✅  | 以批次方式插入目标表                       |
| `ALTER TABLE ADD COLUMN`     | ✅  | 向目标表添加列                          |
| `ALTER TABLE MODIFY SETTING` | ✅  | 修改目标表设置                          |
| `ALTER TABLE PARTITION`      | ✅  | 在目标表上执行分区操作 (DETACH/ATTACH/DROP) |
| `ALTER TABLE UPDATE`         | ✅  | 更新目标表中的行 (变更)                    |
| `ALTER TABLE DELETE`         | ✅  | 删除目标表中的行 (变更)                    |
| `OPTIMIZE TABLE`             | ✅  | 优化目标表 (合并 parts)                 |
| `TRUNCATE TABLE`             | ✅  | 截断目标表                            |

<div id="operations-on-alias">
  ### 对别名本身的操作
</div>

这些操作只影响别名本身，**不会**影响目标表：

| 操作             | 支持 | 说明             |
| -------------- | -- | -------------- |
| `DROP TABLE`   | ✅  | 仅删除别名，目标表保持不变  |
| `RENAME TABLE` | ✅  | 仅重命名别名，目标表保持不变 |

<div id="usage-examples">
  ## 使用示例
</div>

<div id="basic-alias-creation">
  ### 创建简单别名
</div>

在同一数据库中创建一个简单别名：

```sql theme={null}
-- 创建源表
CREATE TABLE source_data (
    id UInt32,
    name String,
    value Float64
) ENGINE = MergeTree
ORDER BY id;

-- 插入一些数据
INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2);

-- 创建别名
CREATE TABLE data_alias ENGINE = Alias('source_data');

-- 通过别名查询
SELECT * FROM data_alias;
```

```text theme={null}
┌─id─┬─name─┬─value─┐
│  1 │ one  │  10.1 │
│  2 │ two  │  20.2 │
└────┴──────┴───────┘
```

<div id="cross-database-alias">
  ### 跨数据库别名
</div>

创建一个指向其他数据库中表的别名：

```sql theme={null}
-- 创建数据库
CREATE DATABASE db1;
CREATE DATABASE db2;

-- 在 db1 中创建源表
CREATE TABLE db1.events (
    timestamp DateTime,
    event_type String,
    user_id UInt32
) ENGINE = MergeTree
ORDER BY timestamp;

-- 在 db2 中创建指向 db1.events 的别名
CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events');

-- 或使用 database.table 格式
CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events');

-- 两个别名的效果完全相同
INSERT INTO db2.events_alias VALUES (now(), 'click', 100);
SELECT * FROM db2.events_alias2;
```

<div id="write-operations">
  ### 通过别名执行写入操作
</div>

所有写入操作都会被转发到目标表：

```sql theme={null}
CREATE TABLE metrics (
    ts DateTime,
    metric_name String,
    value Float64
) ENGINE = MergeTree
ORDER BY ts;

CREATE TABLE metrics_alias ENGINE = Alias('metrics');

-- 通过别名插入
INSERT INTO metrics_alias VALUES 
    (now(), 'cpu_usage', 45.2),
    (now(), 'memory_usage', 78.5);

-- 使用 SELECT 插入
INSERT INTO metrics_alias 
SELECT now(), 'disk_usage', number * 10 
FROM system.numbers 
LIMIT 5;

-- 验证数据是否写入目标表
SELECT count() FROM metrics;  -- 返回 7
SELECT count() FROM metrics_alias;  -- 返回 7
```

<div id="schema-modification">
  ### schema 修改
</div>

`ALTER` 操作用于修改目标表的 schema：

```sql theme={null}
CREATE TABLE users (
    id UInt32,
    name String
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE users_alias ENGINE = Alias('users');

-- 通过别名添加列
ALTER TABLE users_alias ADD COLUMN email String DEFAULT '';

-- 列已添加到目标表
DESCRIBE users;
```

```text theme={null}
┌─name──┬─type───┬─default_type─┬─default_expression─┐
│ id    │ UInt32 │              │                    │
│ name  │ String │              │                    │
│ email │ String │ DEFAULT      │ ''                 │
└───────┴────────┴──────────────┴────────────────────┘
```

<div id="data-mutations">
  ### 数据变更
</div>

支持 UPDATE 和 DELETE 操作：

```sql theme={null}
CREATE TABLE products (
    id UInt32,
    name String,
    price Float64,
    status String DEFAULT 'active'
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE products_alias ENGINE = Alias('products');

INSERT INTO products_alias VALUES 
    (1, 'item_one', 100.0, 'active'),
    (2, 'item_two', 200.0, 'active'),
    (3, 'item_three', 300.0, 'inactive');

-- 通过别名更新
ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active';

-- 通过别名删除
ALTER TABLE products_alias DELETE WHERE status = 'inactive';

-- 更改将应用于目标表
SELECT * FROM products ORDER BY id;
```

```text theme={null}
┌─id─┬─name─────┬─price─┬─status─┐
│  1 │ item_one │ 110.0 │ active │
│  2 │ item_two │ 220.0 │ active │
└────┴──────────┴───────┴────────┘
```

<div id="partition-operations">
  ### 分区操作
</div>

对于分区表，分区操作会被转发执行：

```sql theme={null}
CREATE TABLE logs (
    date Date,
    level String,
    message String
) ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date;

CREATE TABLE logs_alias ENGINE = Alias('logs');

INSERT INTO logs_alias VALUES 
    ('2024-01-15', 'INFO', 'message1'),
    ('2024-02-15', 'ERROR', 'message2'),
    ('2024-03-15', 'INFO', 'message3');

-- 通过别名分离分区
ALTER TABLE logs_alias DETACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- 返回 2（分区 202402 已分离）

-- 重新挂载分区
ALTER TABLE logs_alias ATTACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- 返回 3
```

<div id="table-optimization">
  ### 表优化
</div>

优化操作将合并目标表中的 parts：

```sql theme={null}
CREATE TABLE events (
    id UInt32,
    data String
) ENGINE = MergeTree
ORDER BY id;

CREATE TABLE events_alias ENGINE = Alias('events');

-- 多次插入会创建多个 parts
INSERT INTO events_alias VALUES (1, 'data1');
INSERT INTO events_alias VALUES (2, 'data2');
INSERT INTO events_alias VALUES (3, 'data3');

-- 检查 parts 数量
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;

-- 通过别名执行优化
OPTIMIZE TABLE events_alias FINAL;

-- Parts 在目标表中完成合并
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;  -- 返回 1
```

<div id="alias-management">
  ### 别名管理
</div>

别名可以单独重命名或删除：

```sql theme={null}
CREATE TABLE important_data (
    id UInt32,
    value String
) ENGINE = MergeTree
ORDER BY id;

INSERT INTO important_data VALUES (1, 'critical'), (2, 'important');

CREATE TABLE old_alias ENGINE = Alias('important_data');

-- 重命名别名（目标表不变）
RENAME TABLE old_alias TO new_alias;

-- 为同一张表创建另一个别名
CREATE TABLE another_alias ENGINE = Alias('important_data');

-- 删除一个别名（目标表及其他别名不变）
DROP TABLE new_alias;

SELECT * FROM another_alias;  -- 仍然有效
SELECT count() FROM important_data;  -- 数据完整，返回 2
```
