Alias 引擎会为另一张表创建一个代理。所有读写操作都会转发到目标表,而别名本身不存储任何数据,只保留对目标表的引用。
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_table)
或者显式指定数据库名称:
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_db, target_table)
Alias 表不支持显式定义列。列会自动继承自目标表。这可确保该别名始终与目标表的 schema 保持一致。
target_db (optional) — 包含目标表的数据库名称。
target_table — 目标表名称。
如果省略 target_db,且 target_table 不是完全限定名称 (例如 Alias('my_table')) ,则目标会解析为与别名本身相同的数据库,而不是当前会话所在的数据库。
Alias 表引擎支持所有主要操作。
以下操作会透传到目标表:
| 操作 | 支持 | 说明 |
|---|
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 | ✅ | 截断目标表 |
这些操作只影响别名本身,不会影响目标表:
| 操作 | 支持 | 说明 |
|---|
DROP TABLE | ✅ | 仅删除别名,目标表保持不变 |
RENAME TABLE | ✅ | 仅重命名别名,目标表保持不变 |
在同一数据库中创建一个简单别名:
-- 创建源表
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;
┌─id─┬─name─┬─value─┐
│ 1 │ one │ 10.1 │
│ 2 │ two │ 20.2 │
└────┴──────┴───────┘
创建一个指向其他数据库中表的别名:
-- 创建数据库
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;
所有写入操作都会被转发到目标表:
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
ALTER 操作用于修改目标表的 schema:
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;
┌─name──┬─type───┬─default_type─┬─default_expression─┐
│ id │ UInt32 │ │ │
│ name │ String │ │ │
│ email │ String │ DEFAULT │ '' │
└───────┴────────┴──────────────┴────────────────────┘
支持 UPDATE 和 DELETE 操作:
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;
┌─id─┬─name─────┬─price─┬─status─┐
│ 1 │ item_one │ 110.0 │ active │
│ 2 │ item_two │ 220.0 │ active │
└────┴──────────┴───────┴────────┘
对于分区表,分区操作会被转发执行:
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
优化操作将合并目标表中的 parts:
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
别名可以单独重命名或删除:
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