- ADD COLUMN — يضيف عمودًا جديدًا إلى الجدول.
- DROP COLUMN — يحذف العمود.
- RENAME COLUMN — يعيد تسمية عمود موجود.
- CLEAR COLUMN — يعيد تعيين قيم العمود.
- COMMENT COLUMN — يضيف تعليقًا نصيًا إلى العمود.
- MODIFY COLUMN — يغيّر نوع العمود، وتعبيره الافتراضي، وTTL، وإعدادات العمود.
- MODIFY COLUMN REMOVE — يزيل إحدى خصائص العمود.
- MODIFY COLUMN MODIFY SETTING - يغيّر إعدادات العمود.
- MODIFY COLUMN RESET SETTING - يعيد تعيين إعدادات العمود.
- MODIFY COLUMN ADD ENUM VALUES - يضيف قيمًا جديدة إلى Enum.
- MATERIALIZE COLUMN — يُجسِّد العمود في الأجزاء التي يكون فيها العمود مفقودًا. يَرِد وصف هذه الإجراءات بالتفصيل أدناه.
ADD COLUMN
name وtype وcodec وdefault_expr المحددة (راجع قسم التعبيرات الافتراضية).
إذا كانت العبارة IF NOT EXISTS مضمنة، فلن يُرجع الاستعلام خطأً إذا كان العمود موجودًا بالفعل. وإذا حدّدت AFTER name_after (اسم عمود آخر)، فسيُضاف العمود بعد العمود المحدد في قائمة أعمدة الجدول. وإذا أردت إضافة عمود إلى بداية الجدول، فاستخدم العبارة FIRST. بخلاف ذلك، يُضاف العمود إلى نهاية الجدول. وفي سلسلة من الإجراءات، يمكن أن يكون name_after اسم عمود أُضيف في أحد الإجراءات السابقة.
إن إضافة عمود لا تغيّر سوى بنية الجدول، من دون تنفيذ أي إجراءات على البيانات. ولا تظهر البيانات على القرص بعد ALTER. وإذا كانت البيانات مفقودة لعمود ما عند القراءة من الجدول، فتُستكمل بالقيم الافتراضية (من خلال تنفيذ التعبير الافتراضي إن وُجد، أو باستخدام الأصفار أو السلاسل الفارغة). ويظهر العمود على القرص بعد دمج أجزاء البيانات (راجع MergeTree).
يتيح هذا النهج إكمال الاستعلام ALTER على الفور، من دون زيادة حجم البيانات القديمة.
مثال:
DROP COLUMN
name. إذا تم تحديد العبارة IF EXISTS، فلن يُرجع الاستعلام خطأً إذا لم يكن العمود موجودًا.
يحذف البيانات من نظام الملفات. ونظرًا لأن هذا يحذف ملفات كاملة، يكتمل الاستعلام بشكل شبه فوري.
مثال:
RENAME COLUMN
name إلى new_name. إذا تم تحديد العبارة IF EXISTS، فلن يُرجع الاستعلام خطأً إذا كان العمود غير موجود. ونظرًا إلى أن إعادة التسمية لا تتضمن البيانات الفعلية، يكتمل الاستعلام بشكل شبه فوري.
ملاحظة: لا يمكن إعادة تسمية الأعمدة المحددة في تعبير مفتاح الجدول (سواء باستخدام ORDER BY أو PRIMARY KEY). وستؤدي محاولة تغيير هذه الأعمدة إلى ظهور SQL Error [524].
مثال:
CLEAR COLUMN
IF EXISTS، فلن يُرجع الاستعلام خطأً إذا لم يكن العمود موجودًا.
مثال:
COMMENT COLUMN
IF EXISTS، فلن يُرجع الاستعلام خطأً إذا لم يكن العمود موجودًا.
يمكن أن يكون لكل عمود تعليق واحد. إذا كان هناك تعليق للعمود بالفعل، فإن أي تعليق جديد سيستبدل التعليق السابق.
تُخزَّن التعليقات في العمود comment_expression الذي يعيده استعلام DESCRIBE TABLE.
مثال:
MODIFY COLUMN
name:
- النوع
- التعبير الافتراضي
- Codec الضغط
- TTL
- الإعدادات على مستوى العمود
- قيم Enum لأنواع Enum/Enum8/Enum16
IF EXISTS، فلن يُرجع الاستعلام خطأً إذا لم يكن العمود موجودًا.
عند تغيير النوع، تُحوَّل القيم كما لو كانت دوال toType قد طُبِّقت عليها. وإذا جرى تغيير التعبير الافتراضي فقط، فلن ينفّذ الاستعلام أي عمليات معقدة، ويكتمل تقريبًا على الفور.
مثال:
FIRST | AFTER، راجع وصف ADD COLUMN، ولكن يكون تحديد نوع العمود إلزاميًا في هذه الحالة.
مثال:
ALTER ذري. وبالنسبة إلى جداول MergeTree، فهو أيضًا يعمل من دون أقفال.
استعلام ALTER الخاص بتغيير الأعمدة مُكرَّر. تُحفَظ التعليمات في ZooKeeper، ثم تطبّقها كل نسخة متماثلة. وتُنفَّذ جميع استعلامات ALTER بالترتيب نفسه. وينتظر الاستعلام حتى تكتمل الإجراءات المناسبة على النسخ المتماثلة الأخرى. ومع ذلك، يمكن مقاطعة استعلام تغيير الأعمدة في جدول مُكرَّر، وستُنفَّذ جميع الإجراءات بشكل غير متزامن.
يُرجى توخّي الحذر عند تغيير عمود من نوع Nullable إلى Non-Nullable. تأكّد من أنه لا يحتوي على أي قيم NULL، وإلا فسيتسبب ذلك في مشكلات عند القراءة منه. في هذه الحالة، يكون الحل البديل هو إيقاف الـ mutation بالقوة ثم إعادة العمود إلى النوع Nullable.
MODIFY COLUMN REMOVE
DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS.
الصيغة:
MODIFY COLUMN MODIFY SETTING
max_compress_block_size للعمود إلى 1MB:
MODIFY COLUMN RESET SETTING
max_compress_block_size إلى قيمته الافتراضية:
MODIFY COLUMN ADD ENUM VALUES
Enum أو Enum8 أو Enum16 أو Nullable(Enum) أو Nullable(Enum8) أو Nullable(Enum16)
الصيغة:
enum_column_name:
MATERIALIZE COLUMN
DEFAULT أو MATERIALIZED. عند إضافة عمود materialized باستخدام ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED، لا تُملأ تلقائيًا الصفوف الحالية التي لا تحتوي على قيم materialized. ويمكن استخدام التعليمة MATERIALIZE COLUMN لإعادة كتابة بيانات العمود الحالية بعد إضافة تعبير DEFAULT أو MATERIALIZED أو تحديثه (إذ لا يؤدّي ذلك إلا إلى تحديث البيانات الوصفية، من دون تغيير البيانات الحالية). لاحظ أن تحويل عمود ضمن مفتاح الفرز إلى عمود materialized عملية غير صالحة، لأنها قد تؤدي إلى كسر ترتيب الفرز.
ويُنفَّذ ذلك على هيئة mutation.
بالنسبة إلى الأعمدة التي تحتوي على تعبير قيمة MATERIALIZED جديد أو محدَّث، يُعاد كتابة جميع الصفوف الحالية.
أما الأعمدة التي تحتوي على تعبير قيمة DEFAULT جديد أو محدَّث، فيعتمد سلوكها على إصدار ClickHouse:
- في ClickHouse < v24.2، يُعاد كتابة جميع الصفوف الحالية.
- في ClickHouse >= v24.2، يميّز ClickHouse بين ما إذا كانت قيمة صف في عمود ذي تعبير قيمة
DEFAULTقد حُدِّدت صراحةً عند insert أم لا، أي ما إذا كانت قد حُسبت من تعبير قيمةDEFAULT. فإذا كانت القيمة قد حُدِّدت صراحةً، يُبقيها ClickHouse كما هي. أما إذا كانت القيمة قد حُسبت، فإن ClickHouse يغيّرها إلى تعبير قيمةMATERIALIZEDالجديد أو المحدَّث.
- إذا حدّدت PARTITION، فسيُخزَّن العمود فعليًا للتقسيم المحدد فقط.
القيود
ALTER إنشاء العناصر المنفصلة (الأعمدة) وحذفها داخل بُنى البيانات المتداخلة، لكنه لا يدعم إنشاء بُنى البيانات المتداخلة أو حذفها بالكامل. ولإضافة بنية بيانات متداخلة، يمكنك إضافة أعمدة باسم مثل name.nested_name وبنوع Array(T). وتُعد بنية البيانات المتداخلة مكافئة لعدة أعمدة مصفوفات تشترك أسماؤها في البادئة نفسها قبل النقطة.
دعم إعادة تسمية الأعمدة التي تتضمن أسماؤها نقاطًا هو دعم جزئي. فالنقاط محجوزة للوصول إلى العمود الفرعي Nested، لذلك يجب أن تظل البادئة (اسم الأصل) كما هي. ولا يمكن تغيير سوى اللاحقة (اسم العمود الفرعي). على سبيل المثال، يمكن إعادة تسمية a.b إلى a.c، لكن لا يُسمح بإعادة تسمية a.b إلى b.d لأن ذلك يغيّر بادئة الأصل في Nested.
لا يوجد دعم لحذف الأعمدة الموجودة في المفتاح الأساسي أو مفتاح أخذ العينات (أي الأعمدة المستخدمة في تعبير ENGINE). ولا يمكن تغيير نوع الأعمدة المضمّنة في المفتاح الأساسي إلا إذا كان هذا التغيير لا يؤدي إلى تعديل البيانات (على سبيل المثال، يُسمح بإضافة قيم إلى Enum أو تغيير النوع من DateTime إلى UInt32).
إذا لم يكن استعلام ALTER كافيًا لإجراء تغييرات الجدول التي تحتاج إليها، فيمكنك إنشاء جدول جديد، ونسخ البيانات إليه باستخدام استعلام INSERT SELECT، ثم تبديل الجدولين باستخدام استعلام RENAME وحذف الجدول القديم.
يحظر استعلام ALTER جميع عمليات القراءة والكتابة على الجدول. وبعبارة أخرى، إذا كان استعلام SELECT طويلًا قيد التنفيذ وقت تشغيل استعلام ALTER، فسوف ينتظر استعلام ALTER حتى يكتمل. وفي الوقت نفسه، ستنتظر جميع الاستعلامات الجديدة على الجدول نفسه طوال فترة تنفيذ ALTER.
بالنسبة إلى الجداول التي لا تخزّن البيانات بنفسها (مثل Merge وDistributed)، فإن ALTER يغيّر بنية الجدول فقط، ولا يغيّر بنية الجداول التابعة. على سبيل المثال، عند تشغيل ALTER على جدول Distributed، ستحتاج أيضًا إلى تشغيل ALTER على الجداول الموجودة على جميع الخوادم البعيدة.