ON CLUSTER، وهي موصوفة بشكل منفصل.
صيغة بناء الجملة
إنشاء جدول بمخطط محدد صراحةً
table_name في قاعدة البيانات db أو في قاعدة البيانات الحالية إذا لم يتم تعيين db، بالبنية المحددة بين الأقواس وباستخدام محرّك engine.
تتكون بنية الجدول من قائمة بأوصاف الأعمدة، والفهارس الثانوية، والإسقاطات، والقيود. إذا كان المفتاح الأساسي مدعومًا من قِبل المحرّك، فسيُشار إليه على أنه معلمة لمحرّك الجدول.
يكون وصف العمود، في أبسط الحالات، على الشكل name type. مثال: RegionID UInt32.
يمكن كتابة المعدِّلات التي تلي النوع — COMMENT وcompression_codec وSTATISTICS وTTL وCOLLATE وPRIMARY KEY وSETTINGS لكل عمود — بأي ترتيب، وبحد أقصى مرة واحدة لكل منها. على سبيل المثال، RegionID UInt32 CODEC(ZSTD) COMMENT 'comment for column' وRegionID UInt32 COMMENT 'comment for column' CODEC(ZSTD) متماثلان. لاحظ أن SHOW CREATE TABLE يطبع تعريف العمود بصيغة موحّدة: إذ تُطبع المعدِّلات المتبقية فيه دائمًا بالترتيب المعياري COMMENT وCODEC وSTATISTICS وTTL وCOLLATE وSETTINGS، بينما يُنقل PRIMARY KEY لكل عمود من تعريف العمود إلى عبارة PRIMARY KEY على مستوى الجدول.
يمكن أيضًا تعريف تعبيرات للقيم الافتراضية (انظر أدناه).
عند الحاجة، يمكن تحديد المفتاح الأساسي باستخدام تعبير مفتاح واحد أو أكثر.
يمكن إضافة تعليقات إلى الأعمدة وإلى الجدول.
إنشاء جدول بمخطط جدول موجود
إنشاء جدول باستخدام مخطط وبيانات جدول موجود
db.table. وبعبارة أخرى، تُستنسخ بيانات db.table إلى db2.table_clone عند إنشائه. وهذا الاستعلام مكافئ لما يلي:
db.table).
إنشاء جدول باستخدام دالة الجدول
إنشاء جدول باستخدام استعلام SELECT
SELECT، باستخدام المحرك engine، ويملؤه ببيانات من SELECT. ويمكنك أيضًا تحديد وصف الأعمدة بشكل صريح.
إذا كان الجدول موجودًا بالفعل وتم تحديد IF NOT EXISTS، فلن ينفّذ الاستعلام أي إجراء.
يمكن أن تتضمن العبارة عبارات أخرى بعد عبارة ENGINE. راجع الوثائق التفصيلية حول كيفية إنشاء الجداول في أوصاف محركات الجداول.
مثال
Query
Response
تحديد القيم الافتراضية للأعمدة
DEFAULT expr أو MATERIALIZED expr أو ALIAS expr. مثال: URLDomain String DEFAULT domain(URL).
يكون التعبير expr اختياريًا. وإذا أُهمل، فيجب تحديد نوع العمود صراحةً، وتكون القيمة الافتراضية 0 للأعمدة الرقمية، و'' (السلسلة الفارغة) لأعمدة السلاسل النصية، و[] (المصفوفة الفارغة) لأعمدة المصفوفات، و1970-01-01 لأعمدة التاريخ، أو NULL للأعمدة Nullable.
يمكن حذف نوع العمود في عمود ذي قيمة افتراضية، وفي هذه الحالة يُستدل عليه من نوع expr. على سبيل المثال، سيكون نوع العمود EventDate DEFAULT toDate(EventTime) هو التاريخ.
إذا جرى تحديد كلٍّ من نوع بيانات وتعبير قيمة افتراضية، فستُدرج دالة ضمنية لتحويل النوع تقوم بتحويل التعبير إلى النوع المحدد. مثال: Hits UInt32 DEFAULT 0 تُمثَّل داخليًا على النحو Hits UInt32 DEFAULT toUInt32(0).
يمكن أن يشير تعبير القيمة الافتراضية expr إلى أي أعمدة في الجدول وإلى الثوابت. ويتحقق ClickHouse من أن التغييرات في بنية الجدول لا تؤدي إلى ظهور حلقات في حساب التعبير. وبالنسبة إلى INSERT، فإنه يتحقق من أن التعابير قابلة للحل — أي إن جميع الأعمدة التي يمكن حسابها انطلاقًا منها قد تم تمريرها.
DEFAULT
DEFAULT expr
القيمة الافتراضية العادية. إذا لم تُحدَّد قيمة هذا العمود في استعلام INSERT، فستُحتسب من expr.
مثال:
MATERIALIZED
MATERIALIZED expr
تعبير MATERIALIZED. تُحتسب قيم هذه الأعمدة تلقائيًا وفقًا لتعبير MATERIALIZED المحدد عند إدراج الصفوف. ولا يمكن تحديد هذه القيم صراحةً أثناء عمليات INSERT.
كذلك، لا تُدرج الأعمدة ذات القيم الافتراضية من هذا النوع في نتيجة SELECT *. والغرض من ذلك هو الحفاظ على الثابت الذي ينص على أن نتيجة SELECT * يمكن دائمًا إدراجها مرة أخرى في الجدول باستخدام INSERT. ويمكن تعطيل هذا السلوك باستخدام الإعداد asterisk_include_materialized_columns.
مثال:
EPHEMERAL
EPHEMERAL [expr]
عمود مؤقت. الأعمدة من هذا النوع لا تُخزَّن في الجدول، ولا يمكن إجراء SELECT عليها. والغرض الوحيد من الأعمدة المؤقتة هو إنشاء تعبيرات القيم الافتراضية لأعمدة أخرى بالاعتماد عليها.
أي عملية إدراج لا تُحدَّد فيها الأعمدة صراحةً ستتجاوز الأعمدة من هذا النوع. وذلك للحفاظ على الثابت القائل إن نتيجة SELECT * يمكن دائمًا إدراجها مجددًا في الجدول باستخدام INSERT.
مثال:
ALIAS
ALIAS expr
الأعمدة المحسوبة (مرادف). الأعمدة من هذا النوع لا تُخزَّن في الجدول، ولا يمكن إدراج قيم فيها باستخدام INSERT.
عندما تشير استعلامات SELECT صراحةً إلى أعمدة من هذا النوع، تُحتسَب القيمة وقت الاستعلام من expr. افتراضيًا، يستبعد SELECT * أعمدة ALIAS. ويمكن تعطيل هذا السلوك باستخدام الإعداد asterisk_include_alias_columns.
عند استخدام استعلام ALTER لإضافة أعمدة جديدة، لا تُكتب البيانات القديمة لهذه الأعمدة. وبدلًا من ذلك، عند قراءة البيانات القديمة التي لا تحتوي على قيم للأعمدة الجديدة، تُحتسَب التعبيرات تلقائيًا افتراضيًا. ومع ذلك، إذا كان تقييم هذه التعبيرات يتطلب أعمدة أخرى غير مذكورة في الاستعلام، فستُقرأ هذه الأعمدة أيضًا، ولكن فقط لكتل البيانات التي تحتاج إلى ذلك.
إذا أضفت عمودًا جديدًا إلى جدول ثم غيّرت لاحقًا تعبيره الافتراضي، فستتغيّر القيم المستخدمة للبيانات القديمة (أي البيانات التي لم تُخزَّن قيمها على القرص). لاحظ أنه عند تنفيذ عمليات الدمج في الخلفية، تُكتب بيانات الأعمدة المفقودة في أحد الأجزاء التي يجري دمجها إلى الجزء المدمج.
لا يمكن تعيين قيم افتراضية لعناصر هياكل البيانات المتداخلة.
معدِّلات NULL أو NOT NULL
NULL وNOT NULL، اللذان يأتيان بعد نوع البيانات في تعريف العمود، بجعل النوع Nullable أو بعدم جعله كذلك.
إذا لم يكن النوع Nullable وتم تحديد NULL، فسيُعامل على أنه Nullable؛ أما إذا تم تحديد NOT NULL، فلن يُعامل كذلك. على سبيل المثال، INT NULL تعادل Nullable(INT). وإذا كان النوع Nullable وتم تحديد المعدِّلين NULL أو NOT NULL، فسيتم طرح استثناء.
انظر أيضًا إلى الإعداد data_type_default_nullable.
يمكنك تحديد مفتاح أساسي عند إنشاء جدول. ويمكن تحديد المفتاح الأساسي بإحدى طريقتين:
ضمن قائمة الأعمدة
خارج قائمة الأعمدة
تحديد قيود الجدول
CONSTRAINT
boolean_expr_1 أي تعبير Boolean. إذا كانت هناك قيود معرّفة للـ table، فسيتم التحقق من كل واحد منها لكل صف في استعلام INSERT. وإذا لم يُستوفَ أي قيد، فسيرفع server استثناءً يتضمن اسم القيد وتعبير التحقق.
قد تؤثر إضافة عدد كبير من القيود سلبًا في أداء استعلامات INSERT الكبيرة.
يمكن فحص القيود الموجودة في جميع الـ tables من خلال table system.constraints.
ASSUME
ASSUME لتعريف CONSTRAINT على جدول يُفترض أنها true. ويمكن للمُحسِّن بعد ذلك استخدام هذا القيد لتحسين أداء استعلامات SQL.
خذ هذا المثال الذي يُستخدم فيه ASSUME CONSTRAINT عند إنشاء الجدول users_a:
ASSUME CONSTRAINT للتأكيد على أن الدالة length(name) تساوي دائمًا قيمة العمود name_len. وهذا يعني أنه كلما استُدعيت length(name) في استعلام، يمكن لـ ClickHouse استبدالها بـ name_len، ومن المفترض أن يكون ذلك أسرع لأنه يتجنب استدعاء الدالة length().
بعد ذلك، عند تنفيذ الاستعلام SELECT name FROM users_a WHERE length(name) < 5;، يمكن لـ ClickHouse تحسينه إلى SELECT name FROM users_a WHERE name_len < 5; بفضل ASSUME CONSTRAINT. وقد يجعل ذلك تنفيذ الاستعلام أسرع لأنه يتجنب حساب طول name لكل صف.
ASSUME CONSTRAINT لا يفرض القيد، بل يقتصر على إبلاغ المُحسِّن بأن القيد صحيح. وإذا لم يكن القيد صحيحًا بالفعل، فقد تكون نتائج الاستعلامات غير صحيحة. لذلك، ينبغي ألا تستخدم ASSUME CONSTRAINT إلا إذا كنت متأكدًا من صحة هذا القيد.
تحديد مدة التخزين باستخدام TTL
اختيار برامج ترميز ضغط الأعمدة
lz4 في الإصدار المُدار ذاتيًا، وضغط zstd في ClickHouse Cloud. ويمكنك أيضًا تحديد طريقة الضغط لكل عمود على حدة في استعلام CREATE TABLE:
إنشاء جداول مؤقتة
تحديث جدول ذرّياً باستخدام REPLACE TABLE
REPLACE تحديث جدول ذرّياً. للاطلاع على التفاصيل، راجع REPLACE TABLE.
إضافة تعليق إلى جدول
يجب تحديد عبارة
COMMENT بعد أي عبارات خاصة بالتخزين، مثل PARTITION BY وORDER BY وSETTINGS الخاصة بالتخزين.بعد عبارة COMMENT، لن تُحلَّل إلا SETTINGS الخاصة بالاستعلام (مثل max_threads وما إلى ذلك)، وليس الإعدادات المرتبطة بالتخزين.وهذا يعني أن الترتيب الصحيح للعبارات هو:ENGINE- عبارات التخزين
COMMENT- إعدادات الاستعلام (إن وجدت)
Query
Response