跳到主要内容
跳到主要内容

Alias 表引擎

Experimental feature. Learn more.

Alias 引擎会创建指向另一张表的代理。所有读写操作都会被转发到目标表,而别名表本身不存储任何数据,只维护对目标表的引用。

参考资料

这是一个实验性特性,在未来版本中可能会以不向后兼容的方式发生变更。 要启用 Alias 表引擎,请通过设置 allow_experimental_alias_table_engine。 输入命令 set allow_experimental_alias_table_engine = 1

创建表

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(可选) — 包含目标表的数据库名称。
  • target_table — 目标表的名称。

支持的操作

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

目标表上的操作

这些操作会被转发到目标表:

OperationSupportDescription
SELECT从目标表读取数据
INSERT向目标表写入数据
INSERT SELECT批量向目标表插入数据
ALTER TABLE ADD COLUMN向目标表添加列
ALTER TABLE MODIFY SETTING修改目标表的设置
ALTER TABLE PARTITION在目标表上执行分区操作(DETACH/ATTACH/DROP)
ALTER TABLE UPDATE更新目标表中的行(mutation 变更)
ALTER TABLE DELETE从目标表删除行(mutation 变更)
OPTIMIZE TABLE优化目标表(合并数据片段)
TRUNCATE TABLE截断目标表

对别名本身的操作

这些操作只会影响别名,不会影响目标表:

操作支持情况描述
DROP TABLE仅删除别名,目标表保持不变
RENAME TABLE仅重命名别名,目标表保持不变

使用示例

创建基本别名

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

-- Create source table
CREATE TABLE source_data (
    id UInt32,
    name String,
    value Float64
) ENGINE = MergeTree
ORDER BY id;

-- Insert some data
INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2);

-- Create alias
CREATE TABLE data_alias ENGINE = Alias('source_data');

-- Query through alias
SELECT * FROM data_alias;
┌─id─┬─name─┬─value─┐
│  1 │ one  │  10.1 │
│  2 │ two  │  20.2 │
└────┴──────┴───────┘

跨数据库别名

创建一个指向不同数据库中某个表的别名:

-- Create databases
CREATE DATABASE db1;
CREATE DATABASE db2;

-- Create source table in db1
CREATE TABLE db1.events (
    timestamp DateTime,
    event_type String,
    user_id UInt32
) ENGINE = MergeTree
ORDER BY timestamp;

-- Create alias in db2 pointing to db1.events
CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events');

-- Or using database.table format
CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events');

-- Both aliases work identically
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 through alias
INSERT INTO metrics_alias VALUES 
    (now(), 'cpu_usage', 45.2),
    (now(), 'memory_usage', 78.5);

-- Insert with SELECT
INSERT INTO metrics_alias 
SELECT now(), 'disk_usage', number * 10 
FROM system.numbers 
LIMIT 5;

-- Verify data is in the target table
SELECT count() FROM metrics;  -- Returns 7
SELECT count() FROM metrics_alias;  -- Returns 7

表结构修改

ALTER 操作用于修改目标表的表结构:

CREATE TABLE users (
    id UInt32,
    name String
) ENGINE = MergeTree
ORDER BY id;

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

-- Add column through alias
ALTER TABLE users_alias ADD COLUMN email String DEFAULT '';

-- Column is added to target table
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');

-- Update through alias
ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active';

-- Delete through alias
ALTER TABLE products_alias DELETE WHERE status = 'inactive';

-- Changes are applied to target table
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');

-- Detach partition through alias
ALTER TABLE logs_alias DETACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- Returns 2 (partition 202402 detached)

-- Attach partition back
ALTER TABLE logs_alias ATTACH PARTITION '202402';

SELECT count() FROM logs_alias;  -- Returns 3

表优化

对目标表中的分片执行合并优化操作:

CREATE TABLE events (
    id UInt32,
    data String
) ENGINE = MergeTree
ORDER BY id;

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

-- Multiple inserts create multiple parts
INSERT INTO events_alias VALUES (1, 'data1');
INSERT INTO events_alias VALUES (2, 'data2');
INSERT INTO events_alias VALUES (3, 'data3');

-- Check parts count
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;

-- Optimize through alias
OPTIMIZE TABLE events_alias FINAL;

-- Parts are merged in target table
SELECT count() FROM system.parts 
WHERE database = currentDatabase() 
  AND table = 'events' 
  AND active;  -- Returns 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 alias (target table unchanged)
RENAME TABLE old_alias TO new_alias;

-- Create another alias to same table
CREATE TABLE another_alias ENGINE = Alias('important_data');

-- Drop one alias (target table and other aliases unchanged)
DROP TABLE new_alias;

SELECT * FROM another_alias;  -- Still works
SELECT count() FROM important_data;  -- Data intact, returns 2