Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

エイリアス テーブルエンジン

Alias エンジンは、別のテーブルへのプロキシを作成します。読み取りおよび書き込みの操作はすべてターゲットテーブルに転送され、エイリアス自体はデータを保存せず、ターゲットテーブルへの参照のみを保持します。

テーブルの作成

CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_table)

または、データベース名を明示する場合:

CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_db, target_table)

エンジンパラメータ

  • target_db (optional) — ターゲットテーブルを含むデータベース名。
  • target_table — ターゲットテーブル名。

対応している操作

Alias テーブルエンジンは、主要な操作をすべてサポートしています。

ターゲットテーブルに対する操作

以下の操作はターゲットテーブルに委譲されます。

操作 サポート 説明
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 ターゲットテーブルをTRUNCATEする

エイリアス自体に対する操作

これらの操作はエイリアスにのみ影響し、ターゲットテーブルには影響しません

操作 サポート 説明
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;

-- db1.events を指す別名を db2 に作成する
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 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');

-- エイリアス経由でカラムを追加
ALTER TABLE users_alias ADD COLUMN email String DEFAULT '';

-- カラムがターゲットテーブルに追加される
DESCRIBE users;
┌─name──┬─type───┬─default_type─┬─default_expression─┐
│ id    │ UInt32 │              │                    │
│ name  │ String │              │                    │
│ email │ String │ DEFAULT      │ ''                 │
└───────┴────────┴──────────────┴────────────────────┘

データのmutation

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
Navigation