Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

إضافة عمود إلى جدول

إضافة عمود إلى جدول

سنستخدم clickhouse-local:

clickhouse -m --output_format_pretty_row_numbers=

لنفترض أن لدينا الجدول التالي:

CREATE TABLE events (
    date Date DEFAULT today(), 
    name String
) 
ENGINE = MergeTree
ORDER BY date;

لنُضِفْ سجلًا واحدًا:

INSERT INTO events (name) VALUES ('Alexey');

والآن استعلم من جدول events:

SELECT *
FROM events;
┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘

إضافة عمود جديد

لنفترض الآن أننا سنضيف عمودًا جديدًا باسم favoriteNumber، وسيكون من نوع Float64. يمكننا إجراء ذلك باستخدام عبارة ALTER TABLE...ADD COLUMN:

ALTER TABLE events 
ADD COLUMN favoriteNumber Float64 DEFAULT 7;

إذا أجرينا استعلامًا على الجدول events، فسنرى المخرجات التالية:

┌───────date─┬─name───┬─favoriteNumber─┐
│ 2024-12-18 │ Alexey │              7 │
└────────────┴────────┴────────────────┘

تكون القيمة الافتراضية للصف Alexey هي 7 لأن هذا العمود لم يكن موجودًا عند إضافة ذلك الصف. بعد ذلك، لنُضِف عمودًا آخر:

INSERT INTO events (name) VALUES ('Tyler');

إذا أجرينا استعلامًا على جدول events، فسنرى الناتج التالي:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │              7 │
└────────────┴────────┴────────────────┘

تعديل القيمة الافتراضية لعمود

إذا عدّلنا نوع العمود favoriteNumber باستخدام عبارة ALTER TABLE...MODIFY COLUMN، تصبح الأمور أكثر إثارة للاهتمام:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;

إذا نفّذنا استعلامًا على events مرة أخرى، فسنرى هذا الناتج:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │             99 │
└────────────┴────────┴────────────────┘

يحتفظ Tyler بالقيمة 7، وهي القيمة الافتراضية التي كانت مُطبَّقة عند إنشاء ذلك الصف. ويأخذ Alexey القيمة الافتراضية الجديدة 99 لأن العمود favoriteNumber لم يكن موجودًا عند إنشاء ذلك الصف.

إذا أردنا أن يستخدم الصف Alexey القيمة الافتراضية الحالية فورًا، فعلينا استدعاء OPTIMIZE TABLE لفرض كتابة القيم الافتراضية الحالية على القرص:

OPTIMIZE TABLE events;

بعد أن نفعل ذلك، لنفترض أننا غيّرنا القيمة الافتراضية مرة أخرى:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;

ثم أدرِج صفًا آخر:

INSERT INTO events (name) VALUES ('Tanya');

أخيرًا، لنُنفِّذ استعلامًا على events مرةً أخيرة:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │             99 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tanya  │             21 │
└────────────┴────────┴────────────────┘

يعتمد Tanya القيمة الافتراضية الجديدة 21، لكن Alexey لديه القيمة الافتراضية القديمة 99.

التحكم في موضع العمود في الجدول

عند إضافة عمود جديد، يُضاف افتراضيًا إلى نهاية الجدول. ولكن يمكننا استخدام العبارتين FIRST وAFTER للتحكم في موضع العمود.

على سبيل المثال، إذا أردنا إضافة عمود باسم favoriteColor بعد العمود name، فيمكننا القيام بذلك كما يلي:

ALTER TABLE events
ADD COLUMN favoriteColor String DEFAULT 'Yellow' AFTER name;

لنُجرِ استعلامًا على events:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ Yellow        │             99 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tyler  │ Yellow        │              7 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tanya  │ Yellow        │             21 │
└────────────┴────────┴───────────────┴────────────────┘

وإذا أردنا إضافة العمود favoriteDatabase وجعله أول عمود في القائمة، فيمكننا فعل ذلك على النحو التالي:

ALTER TABLE events
ADD COLUMN favoriteDatabase String DEFAULT 'ClickHouse' FIRST;
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ favoriteDatabase ┃       date ┃ name   ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ ClickHouse       │ 2024-12-18 │ Tanya  │ Yellow        │             21 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse       │ 2024-12-18 │ Alexey │ Yellow        │             99 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse       │ 2024-12-18 │ Tyler  │ Yellow        │              7 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘

ولنلقِ نظرة على تعريف الجدول:

SHOW CREATE TABLE events
FORMAT LineAsString
CREATE TABLE default.`clickhouse-local-ab404c86-56cc-495b-ad1d-fb343cac3bc0events`
(
    `favoriteDatabase` String DEFAULT 'ClickHouse',
    `date` Date DEFAULT today(),
    `name` String,
    `favoriteColor` String DEFAULT 'Yellow',
    `favoriteNumber` Float64 DEFAULT 21
)
ENGINE = MergeTree
ORDER BY date
Navigation