> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> توثيق TABLE

# CREATE TABLE

ينشئ جدولًا جديدًا. افتراضيًا، لا تُنشأ الجداول إلا على الخادم الحالي.
وتُنفَّذ استعلامات DDL الموزعة باستخدام عبارة `ON CLUSTER`، وهي [موصوفة بشكل منفصل](/ar/reference/statements/distributed-ddl).

<div id="syntax-forms">
  ## صيغة بناء الجملة
</div>

يمكن أن يأتي هذا الاستعلام بصيغ بناء جملة مختلفة بحسب حالة الاستخدام.

<div id="with-explicit-schema">
  ### إنشاء جدول بمخطط محدد صراحةً
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [COMMENT 'comment for column'] [compression_codec] [TTL expr1],
    name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [COMMENT 'comment for column'] [compression_codec] [TTL expr2],
    ...
) ENGINE = engine
  [COMMENT 'comment for table']
```

ينشئ جدولًا باسم `table_name` في قاعدة البيانات `db` أو في قاعدة البيانات الحالية إذا لم يتم تعيين `db`، بالبنية المحددة بين الأقواس وباستخدام محرّك `engine`.
تتكون بنية الجدول من قائمة بأوصاف الأعمدة، والفهارس الثانوية، والإسقاطات، والقيود. إذا كان [المفتاح الأساسي](#primary-key) مدعومًا من قِبل المحرّك، فسيُشار إليه على أنه معلمة لمحرّك الجدول.

يكون وصف العمود، في أبسط الحالات، على الشكل `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` على مستوى الجدول.

يمكن أيضًا تعريف تعبيرات للقيم الافتراضية (انظر أدناه).

عند الحاجة، يمكن تحديد المفتاح الأساسي باستخدام تعبير مفتاح واحد أو أكثر.

يمكن إضافة تعليقات إلى الأعمدة وإلى الجدول.

<div id="with-a-schema-similar-to-other-table">
  ### إنشاء جدول بمخطط جدول موجود
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db2.]table_clone AS [db.]table [ENGINE = engine]
```

يدعم ClickHouse نسخ مخطط جدول موجود وبياناته.

لاستنساخ مخطط جدول موجود:

ينشئ هذا جدولًا له نفس بنية جدول آخر.

<div id="with-a-schema-and-data-cloned-from-another-table">
  ### إنشاء جدول باستخدام مخطط وبيانات جدول موجود
</div>

لاستنساخ مخطط وبيانات جدول موجود:

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db2.]table_clone CLONE AS [db.]table [ENGINE = engine]
```

يؤدي هذا إلى إنشاء جدول له نفس المخطط والبيانات لجدول موجود. وبعد إنشاء الجدول الجديد، تُرفق به جميع التقسيمات من `db.table`. وبعبارة أخرى، تُستنسخ بيانات `db.table` إلى `db2.table_clone` عند إنشائه. وهذا الاستعلام مكافئ لما يلي:

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db2.]table_clone AS [db.]table [ENGINE = engine];
ALTER TABLE [db2.]table_clone ATTACH PARTITION ALL FROM [db.]table;
```

بالنسبة إلى كلتا الخاصيتين، يمكنك تحديد محرك مختلف للجدول. وإذا لم يُحدَّد المحرك، فسيُستخدَم المحرك نفسه المستخدَم للجدول الأصلي (`db.table`).

<div id="from-a-table-function">
  ### إنشاء جدول باستخدام دالة الجدول
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name AS table_function()
```

ينشئ جدولًا يعطي النتيجة نفسها التي تعطيها [دالة الجدول](/ar/reference/functions/table-functions/index) المحددة. كما سيعمل الجدول المُنشأ بالطريقة نفسها التي تعمل بها دالة الجدول المقابلة المحددة.

<div id="from-select-query">
  ### إنشاء جدول باستخدام استعلام SELECT
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name[(name1 [type1], name2 [type2], ...)] ENGINE = engine AS SELECT ...
```

ينشئ جدولًا ببنية مماثلة لنتيجة استعلام `SELECT`، باستخدام المحرك `engine`، ويملؤه ببيانات من `SELECT`. ويمكنك أيضًا تحديد وصف الأعمدة بشكل صريح.

إذا كان الجدول موجودًا بالفعل وتم تحديد `IF NOT EXISTS`، فلن ينفّذ الاستعلام أي إجراء.

يمكن أن تتضمن العبارة عبارات أخرى بعد عبارة `ENGINE`. راجع الوثائق التفصيلية حول كيفية إنشاء الجداول في أوصاف [محركات الجداول](/ar/reference/engines/table-engines/index).

**مثال**

```sql title="Query" theme={null}
CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;
SELECT x, toTypeName(x) FROM t1;
```

```text title="Response" theme={null}
┌─x─┬─toTypeName(x)─┐
│ 1 │ String        │
└───┴───────────────┘
```

<div id="default_values">
  ## تحديد القيم الافتراضية للأعمدة
</div>

يمكن أن يحدّد وصف العمود تعبيرًا لقيمة افتراضية بصيغة `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، فإنه يتحقق من أن التعابير قابلة للحل — أي إن جميع الأعمدة التي يمكن حسابها انطلاقًا منها قد تم تمريرها.

<div id="default">
  ### DEFAULT
</div>

`DEFAULT expr`

القيمة الافتراضية العادية. إذا لم تُحدَّد قيمة هذا العمود في استعلام INSERT، فستُحتسب من `expr`.

مثال:

```sql theme={null}
CREATE OR REPLACE TABLE test
(
    id UInt64,
    updated_at DateTime DEFAULT now(),
    updated_at_date Date DEFAULT toDate(updated_at)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO test (id) VALUES (1);

SELECT * FROM test;
┌─id─┬──────────updated_at─┬─updated_at_date─┐
│  1 │ 2023-02-24 17:06:46 │      2023-02-24 │
└────┴─────────────────────┴─────────────────┘
```

<div id="materialized">
  ### MATERIALIZED
</div>

`MATERIALIZED expr`

تعبير MATERIALIZED. تُحتسب قيم هذه الأعمدة تلقائيًا وفقًا لتعبير MATERIALIZED المحدد عند إدراج الصفوف. ولا يمكن تحديد هذه القيم صراحةً أثناء عمليات `INSERT`.

كذلك، لا تُدرج الأعمدة ذات القيم الافتراضية من هذا النوع في نتيجة `SELECT *`. والغرض من ذلك هو الحفاظ على الثابت الذي ينص على أن نتيجة `SELECT *` يمكن دائمًا إدراجها مرة أخرى في الجدول باستخدام `INSERT`. ويمكن تعطيل هذا السلوك باستخدام الإعداد `asterisk_include_materialized_columns`.

مثال:

```sql theme={null}
CREATE OR REPLACE TABLE test
(
    id UInt64,
    updated_at DateTime MATERIALIZED now(),
    updated_at_date Date MATERIALIZED toDate(updated_at)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO test VALUES (1);

SELECT * FROM test;
┌─id─┐
│  1 │
└────┘

SELECT id, updated_at, updated_at_date FROM test;
┌─id─┬──────────updated_at─┬─updated_at_date─┐
│  1 │ 2023-02-24 17:08:08 │      2023-02-24 │
└────┴─────────────────────┴─────────────────┘

SELECT * FROM test SETTINGS asterisk_include_materialized_columns=1;
┌─id─┬──────────updated_at─┬─updated_at_date─┐
│  1 │ 2023-02-24 17:08:08 │      2023-02-24 │
└────┴─────────────────────┴─────────────────┘
```

<div id="ephemeral">
  ### EPHEMERAL
</div>

`EPHEMERAL [expr]`

عمود مؤقت. الأعمدة من هذا النوع لا تُخزَّن في الجدول، ولا يمكن إجراء `SELECT` عليها. والغرض الوحيد من الأعمدة المؤقتة هو إنشاء تعبيرات القيم الافتراضية لأعمدة أخرى بالاعتماد عليها.

أي عملية إدراج لا تُحدَّد فيها الأعمدة صراحةً ستتجاوز الأعمدة من هذا النوع. وذلك للحفاظ على الثابت القائل إن نتيجة `SELECT *` يمكن دائمًا إدراجها مجددًا في الجدول باستخدام `INSERT`.

مثال:

```sql theme={null}
CREATE OR REPLACE TABLE test
(
    id UInt64,
    unhexed String EPHEMERAL,
    hexed FixedString(4) DEFAULT unhex(unhexed)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO test (id, unhexed) VALUES (1, '5a90b714');

SELECT
    id,
    hexed,
    hex(hexed)
FROM test
FORMAT Vertical;

Row 1:
──────
id:         1
hexed:      Z��
hex(hexed): 5A90B714
```

<div id="alias">
  ### ALIAS
</div>

`ALIAS expr`

الأعمدة المحسوبة (مرادف). الأعمدة من هذا النوع لا تُخزَّن في الجدول، ولا يمكن إدراج قيم فيها باستخدام `INSERT`.

عندما تشير استعلامات `SELECT` صراحةً إلى أعمدة من هذا النوع، تُحتسَب القيمة وقت الاستعلام من `expr`. افتراضيًا، يستبعد `SELECT *` أعمدة ALIAS. ويمكن تعطيل هذا السلوك باستخدام الإعداد `asterisk_include_alias_columns`.

عند استخدام استعلام `ALTER` لإضافة أعمدة جديدة، لا تُكتب البيانات القديمة لهذه الأعمدة. وبدلًا من ذلك، عند قراءة البيانات القديمة التي لا تحتوي على قيم للأعمدة الجديدة، تُحتسَب التعبيرات تلقائيًا افتراضيًا. ومع ذلك، إذا كان تقييم هذه التعبيرات يتطلب أعمدة أخرى غير مذكورة في الاستعلام، فستُقرأ هذه الأعمدة أيضًا، ولكن فقط لكتل البيانات التي تحتاج إلى ذلك.

إذا أضفت عمودًا جديدًا إلى جدول ثم غيّرت لاحقًا تعبيره الافتراضي، فستتغيّر القيم المستخدمة للبيانات القديمة (أي البيانات التي لم تُخزَّن قيمها على القرص). لاحظ أنه عند تنفيذ عمليات الدمج في الخلفية، تُكتب بيانات الأعمدة المفقودة في أحد الأجزاء التي يجري دمجها إلى الجزء المدمج.

لا يمكن تعيين قيم افتراضية لعناصر هياكل البيانات المتداخلة.

```sql theme={null}
CREATE OR REPLACE TABLE test
(
    id UInt64,
    size_bytes Int64,
    size String ALIAS formatReadableSize(size_bytes)
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO test VALUES (1, 4678899);

SELECT id, size_bytes, size FROM test;
┌─id─┬─size_bytes─┬─size─────┐
│  1 │    4678899 │ 4.46 MiB │
└────┴────────────┴──────────┘

SELECT * FROM test SETTINGS asterisk_include_alias_columns=1;
┌─id─┬─size_bytes─┬─size─────┐
│  1 │    4678899 │ 4.46 MiB │
└────┴────────────┴──────────┘
```

<div id="null-or-not-null-modifiers">
  ## معدِّلات `NULL` أو `NOT NULL`
</div>

يسمح المعدِّلان `NULL` و`NOT NULL`، اللذان يأتيان بعد نوع البيانات في تعريف العمود، بجعل النوع [Nullable](/ar/reference/data-types/nullable) أو بعدم جعله كذلك.

إذا لم يكن النوع `Nullable` وتم تحديد `NULL`، فسيُعامل على أنه `Nullable`؛ أما إذا تم تحديد `NOT NULL`، فلن يُعامل كذلك. على سبيل المثال، `INT NULL` تعادل `Nullable(INT)`. وإذا كان النوع `Nullable` وتم تحديد المعدِّلين `NULL` أو `NOT NULL`، فسيتم طرح استثناء.

انظر أيضًا إلى الإعداد [data\_type\_default\_nullable](/ar/reference/settings/session-settings/other#data_type_default_nullable).

<div id="primary-key">
  ## المفتاح الأساسي
</div>

يمكنك تحديد [مفتاح أساسي](/ar/reference/engines/table-engines/mergetree-family/mergetree#primary-keys-and-indexes-in-queries) عند إنشاء جدول. ويمكن تحديد المفتاح الأساسي بإحدى طريقتين:

<Columns cols={2}>
  <div>
    **ضمن قائمة الأعمدة**

    ```sql theme={null}
    CREATE TABLE [db.]table_name
    (
        name1 type1, name2 type2, ...,
        PRIMARY KEY(expr1[, expr2,...])
    )
    ENGINE = engine;
    ```
  </div>

  <div>
    **خارج قائمة الأعمدة**

    ```sql theme={null}
    CREATE TABLE [db.]table_name
    (
        name1 type1, name2 type2, ...
    )
    ENGINE = engine
    PRIMARY KEY(expr1[, expr2,...]);
    ```
  </div>
</Columns>

<Tip>
  لا يمكنك استخدام كلتا الطريقتين في استعلام واحد.
</Tip>

<div id="constraints">
  ## تحديد قيود الجدول
</div>

يمكن أيضًا تعريف قيود إلى جانب أوصاف الأعمدة:

<div id="constraint">
  ### CONSTRAINT
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
    ...
    CONSTRAINT constraint_name_1 CHECK boolean_expr_1,
    ...
) ENGINE = engine
```

يمكن أن يكون `boolean_expr_1` أي تعبير Boolean. إذا كانت هناك قيود معرّفة للـ table، فسيتم التحقق من كل واحد منها لكل صف في استعلام `INSERT`. وإذا لم يُستوفَ أي قيد، فسيرفع server استثناءً يتضمن اسم القيد وتعبير التحقق.

قد تؤثر إضافة عدد كبير من القيود سلبًا في أداء استعلامات `INSERT` الكبيرة.

يمكن فحص القيود الموجودة في جميع الـ tables من خلال table [`system.constraints`](/ar/reference/system-tables/constraints).

<div id="assume">
  ### ASSUME
</div>

يُستخدم البند `ASSUME` لتعريف `CONSTRAINT` على جدول يُفترض أنها `true`. ويمكن للمُحسِّن بعد ذلك استخدام هذا القيد لتحسين أداء استعلامات SQL.

خذ هذا المثال الذي يُستخدم فيه `ASSUME CONSTRAINT` عند إنشاء الجدول `users_a`:

```sql theme={null}
CREATE TABLE users_a (
    uid Int16, 
    name String, 
    age Int16, 
    name_len UInt8 MATERIALIZED length(name), 
    CONSTRAINT c1 ASSUME length(name) = name_len
) 
ENGINE=MergeTree 
ORDER BY (name_len, name);
```

هنا، يُستخدم `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` إلا إذا كنت متأكدًا من صحة هذا القيد.

<div id="ttl-expression">
  ## تحديد مدة التخزين باستخدام TTL
</div>

يحدّد مدة احتفاظ القيم في التخزين. لا يمكن تحديده إلا للجداول من عائلة MergeTree. للاطلاع على وصف مفصل، راجع [TTL للأعمدة والجداول](/ar/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl).

<div id="column_compression_codec">
  ## اختيار برامج ترميز ضغط الأعمدة
</div>

<a id="general-purpose-codecs" />

<a id="none" />

<a id="lz4" />

<a id="lz4hc" />

<a id="zstd" />

<a id="zxc" />

<a id="zstd_qat" />

<a id="deflate_qpl" />

<a id="specialized-codecs" />

<a id="delta" />

<a id="doubledelta" />

<a id="gcd" />

<a id="gorilla" />

<a id="alp" />

<a id="fpc" />

<a id="sz3" />

<a id="t64" />

<a id="quantized" />

<a id="encryption-codecs" />

<a id="aes_128_gcm_siv" />

<a id="aes-256-gcm-siv" />

<a id="adaptive-codec-selection" />

افتراضيًا، يستخدم ClickHouse ضغط `lz4` في الإصدار المُدار ذاتيًا، وضغط `zstd` في ClickHouse Cloud. ويمكنك أيضًا تحديد طريقة الضغط لكل عمود على حدة في استعلام `CREATE TABLE`:

```sql theme={null}
CREATE TABLE codec_example
(
    dt Date CODEC(ZSTD),
    ts DateTime CODEC(LZ4HC),
    float_value Float32 CODEC(NONE),
    double_value Float64 CODEC(LZ4HC(9)),
    value Float32 CODEC(Delta, ZSTD)
)
ENGINE = <Engine>
...
```

للاطلاع على برامج الترميز المتاحة للأغراض العامة والمتخصصة والتشفير، راجع [برامج ترميز ضغط الأعمدة](/ar/reference/statements/create/table/codec).

<div id="temporary-tables">
  ## إنشاء جداول مؤقتة
</div>

يدعم ClickHouse الجداول المؤقتة التي تُحذف عند انتهاء الجلسة. لمزيد من التفاصيل، راجع [CREATE TEMPORARY TABLE](/ar/reference/statements/create/table/temporary-table).

<div id="replace-table">
  ## تحديث جدول ذرّياً باستخدام REPLACE TABLE
</div>

<a id="syntax" />

<a id="examples" />

تتيح لك عبارة `REPLACE` تحديث جدول [ذرّياً](/ar/concepts/core-concepts/glossary#atomicity). للاطلاع على التفاصيل، راجع [REPLACE TABLE](/ar/reference/statements/create/table/replace-table).

<div id="comment-clause">
  ## إضافة تعليق إلى جدول
</div>

يمكنك إضافة تعليق إلى الجدول عند إنشائه.

**الصيغة**

```sql theme={null}
CREATE TABLE [db.]table_name
(
    name1 type1, name2 type2, ...
)
ENGINE = engine
COMMENT 'Comment'
```

<Note>
  يجب تحديد عبارة `COMMENT` **بعد** أي عبارات خاصة بالتخزين، مثل `PARTITION BY` و`ORDER BY` و`SETTINGS` الخاصة بالتخزين.

  بعد عبارة `COMMENT`، لن تُحلَّل إلا `SETTINGS` الخاصة بالاستعلام (مثل `max_threads` وما إلى ذلك)، وليس الإعدادات المرتبطة بالتخزين.

  وهذا يعني أن الترتيب الصحيح للعبارات هو:

  * `ENGINE`
  * عبارات التخزين
  * `COMMENT`
  * إعدادات الاستعلام (إن وجدت)
</Note>

**مثال**

```sql title="Query" theme={null}
CREATE TABLE t1 (x String) ENGINE = Memory COMMENT 'The temporary table';
SELECT name, comment FROM system.tables WHERE name = 't1';
```

```text title="Response" theme={null}
┌─name─┬─comment─────────────┐
│ t1   │ The temporary table │
└──────┴─────────────────────┘
```

<div id="related-content">
  ## محتوى ذو صلة
</div>

* مدونة: [تحسين ClickHouse باستخدام المخططات وCodecs](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)
* مدونة: [العمل مع بيانات السلاسل الزمنية في ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse)
