Движок 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 не поддерживает явное описание столбцов. Столбцы автоматически наследуются от целевой таблицы. Благодаря этому таблица-псевдоним всегда соответствует схеме целевой таблицы.
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 | ✅ | Оптимизация целевой таблицы (слияние частей) |
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 изменяют схему целевой таблицы:
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
Операции оптимизации объединяют части в целевой таблице:
CREATE TABLE events (
id UInt32,
data String
) ENGINE = MergeTree
ORDER BY id;
CREATE TABLE events_alias ENGINE = Alias('events');
-- Несколько вставок создают несколько частей
INSERT INTO events_alias VALUES (1, 'data1');
INSERT INTO events_alias VALUES (2, 'data2');
INSERT INTO events_alias VALUES (3, 'data3');
-- Проверить количество частей
SELECT count() FROM system.parts
WHERE database = currentDatabase()
AND table = 'events'
AND active;
-- Оптимизация через псевдоним
OPTIMIZE TABLE events_alias FINAL;
-- Части объединяются в целевой таблице
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
Последнее изменение 10 июня 2026 г.