الانتقال إلى المحتوى الرئيسي
ينشئ المحرك Alias وكيلاً لجدول آخر. وتُمرَّر جميع عمليات القراءة والكتابة إلى الجدول الهدف، بينما لا يخزّن الاسم المستعار نفسه أي بيانات، ولا يحتفظ إلا بمرجع إلى الجدول الهدف.

إنشاء جدول

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عمليات partition ‏(DETACH/ATTACH/DROP) على الهدف
ALTER TABLE UPDATEتحديث الصفوف في الجدول الهدف (mutation)
ALTER TABLE DELETEحذف الصفوف من الجدول الهدف (mutation)
OPTIMIZE TABLEتحسين الجدول الهدف (دمج الأجزاء)
TRUNCATE TABLEتفريغ الجدول الهدف

عمليات على Alias نفسه

تؤثر هذه العمليات في Alias فقط، وليس في الجدول الهدف:
العمليةالدعمالوصف
DROP TABLEحذف Alias فقط، مع بقاء الجدول الهدف دون تغيير
RENAME TABLEإعادة تسمية Alias فقط، مع بقاء الجدول الهدف دون تغيير

أمثلة الاستخدام

إنشاء Alias بسيط

أنشئ Alias بسيطًا داخل قاعدة البيانات نفسها:
-- 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 │
└────┴──────┴───────┘

Alias بين قواعد البيانات

أنشئ Alias يشير إلى جدول في قاعدة بيانات أخرى:
-- 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;

عمليات الكتابة عبر Alias

تُمرَّر جميع عمليات الكتابة إلى الجدول الهدف:
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

إدارة Alias

يمكن إعادة تسمية Alias أو حذف كلٍّ منها بشكل مستقل:
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
آخر تعديل في ٢٩ يونيو ٢٠٢٦