إنشاء الجداول (CREATE TABLE)

إنشاء الجداول (CREATE TABLE) هو حجر الأساس في بناء أي قاعدة بيانات عملية. الجداول هي المكان الفعلي الذي تُخزن فيه البيانات في قاعدة البيانات، وتصميمها بشكل صحيح يؤثر بشكل مباشر على أداء التطبيق، سهولة الصيانة، وقابلية التوسع. في هذا الدرس الشامل والمفصل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم كيفية إنشاء الجداول من الصفر، تحديد الأعمدة وأنواع البيانات المناسبة، إضافة القيود (Constraints) لضمان سلامة البيانات، وأفضل الممارسات لتصميم جداول احترافية تلبي احتياجات المشاريع الحقيقية. سنغطي كل جانب من جوانب إنشاء الجداول مع أمثلة عملية تطبيقية مفصلة.

1. ما هو الجدول في قواعد البيانات (Table)؟

الجدول (Table) في قواعد البيانات العلائقية هو بنية منظمة تُستخدم لتخزين البيانات في صفوف وأعمدة، تماماً مثل جدول Excel أو جدول ورقي تقليدي. كل جدول يمثل كياناً معيناً (Entity) في نظامك، مثل: المستخدمين، المنتجات، الطلبات، الفواتير، أو أي شيء آخر تحتاج لتخزين معلومات عنه. الجدول يتكون من عنصرين أساسيين:

الأعمدة (Columns)

الأعمدة تمثل الخصائص أو السمات (Attributes) للكيان. على سبيل المثال، في جدول المستخدمين، قد تكون الأعمدة: المعرف (ID)، الاسم (Name)، البريد الإلكتروني (Email)، تاريخ الميلاد (Birth Date)، وتاريخ التسجيل (Registration Date). كل عمود له اسم فريد ونوع بيانات محدد (Data Type) يحدد نوع القيم التي يمكن تخزينها فيه. على سبيل المثال، عمود العمر يجب أن يكون من نوع رقمي (INT)، بينما عمود الاسم يجب أن يكون من نوع نصي (VARCHAR).

الصفوف (Rows)

الصفوف (تسمى أيضاً السجلات - Records) تمثل الحالات الفردية أو الأمثلة الفعلية للكيان. في جدول المستخدمين، كل صف يمثل مستخدماً واحداً بمعلوماته الكاملة. إذا كان لديك 1000 مستخدم مسجل في نظامك، فسيكون لديك 1000 صف في جدول المستخدمين. كل صف يحتوي على قيم محددة لكل عمود من أعمدة الجدول.

لفهم العلاقة بين الجداول والبيانات بشكل أفضل، تخيل أنك تدير مكتبة. ستحتاج إلى جدول للكتب (يحتوي على: رقم الكتاب، العنوان، المؤلف، سنة النشر، عدد الصفحات)، جدول للأعضاء (يحتوي على: رقم العضو، الاسم، العنوان، رقم الهاتف)، وجدول للاستعارات (يحتوي على: رقم الاستعارة، رقم الكتاب، رقم العضو، تاريخ الاستعارة، تاريخ الإرجاع المتوقع). كل جدول يخزن نوعاً معيناً من المعلومات، والجداول مرتبطة ببعضها من خلال علاقات منطقية.

2. الصيغة الأساسية لإنشاء جدول: CREATE TABLE

أمر CREATE TABLE هو الأمر الأساسي لإنشاء جدول جديد في قاعدة البيانات. الصيغة العامة تتكون من اسم الجدول ومجموعة من تعريفات الأعمدة.

الصيغة الأساسية لإنشاء جدول
CREATE TABLE table_name (
    column1_name data_type,
    column2_name data_type,
    column3_name data_type,
    ...
);

شرح مكونات الصيغة:

  • CREATE TABLE هي الكلمات المفتاحية التي تخبر SQL بأنك تريد إنشاء جدول جديد.
  • table_name هو الاسم الذي تختاره للجدول (يجب أن يكون فريداً داخل قاعدة البيانات).
  • بين القوسين ( ) تضع تعريفات الأعمدة، كل عمود في سطر منفصل.
  • كل تعريف عمود يتكون من: اسم العمود، نوع البيانات، وقيود اختيارية.
  • تفصل بين تعريفات الأعمدة بفاصلة ,
مثال بسيط: إنشاء جدول للطلاب
مثال 1: جدول بسيط للطلاب
CREATE TABLE students (
    student_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    age INT,
    grade DECIMAL(5, 2)
);
النتيجة
Query OK, 0 rows affected (0.05 sec)
Table 'students' created successfully.

شرح الجدول:

  • student_id INT - عمود لرقم الطالب، نوع بيانات رقمي صحيح.
  • first_name VARCHAR(50) - عمود للاسم الأول، نص متغير الطول حتى 50 حرف.
  • last_name VARCHAR(50) - عمود للاسم الأخير، نص متغير الطول حتى 50 حرف.
  • age INT - عمود للعمر، رقم صحيح.
  • grade DECIMAL(5, 2) - عمود للدرجة، رقم عشري (مثال: 95.50).

3. اختيار أنواع البيانات المناسبة (Data Types)

اختيار نوع البيانات المناسب لكل عمود هو قرار حاسم يؤثر على الأداء، المساحة التخزينية، ودقة البيانات. دعونا نستعرض الأنواع الأكثر استخداماً:

الأنواع الرقمية الشائعة
النوع الوصف أمثلة الاستخدام
INT أرقام صحيحة (±2 مليار تقريباً) المعرفات، الأعمار، الكميات
BIGINT أرقام صحيحة كبيرة جداً أرقام الهواتف، معرفات ضخمة
DECIMAL(p,s) أرقام عشرية دقيقة الأسعار، المبالغ المالية
FLOAT أرقام عشرية تقريبية القياسات العلمية
الأنواع النصية الشائعة
النوع الوصف أمثلة الاستخدام
VARCHAR(n) نص متغير الطول (حتى n حرف) الأسماء، العناوين، البريد الإلكتروني
CHAR(n) نص ثابت الطول رموز الدول (SA, US)، الرموز الثابتة
TEXT نصوص طويلة (حتى 65,535 حرف) الوصف، المحتوى، التعليقات
أنواع التاريخ والوقت
النوع الصيغة أمثلة الاستخدام
DATE YYYY-MM-DD تاريخ الميلاد، تاريخ التسجيل
DATETIME YYYY-MM-DD HH:MM:SS وقت الإنشاء، آخر تحديث
TIMESTAMP YYYY-MM-DD HH:MM:SS تتبع التعديلات التلقائية

4. المفتاح الأساسي (PRIMARY KEY)

المفتاح الأساسي (Primary Key) هو عمود أو مجموعة أعمدة تُستخدم لتحديد كل صف في الجدول بشكل فريد. كل جدول يجب أن يحتوي على مفتاح أساسي واحد فقط. المفتاح الأساسي له خصائص مهمة جداً:

  • الفرادة (Uniqueness): لا يمكن أن يكون هناك صفان لهما نفس قيمة المفتاح الأساسي.
  • عدم القبول بـ NULL: المفتاح الأساسي لا يمكن أن يكون فارغاً (NULL).
  • الثبات: قيمة المفتاح الأساسي لا يجب أن تتغير بعد إنشاء الصف.
  • الفهرسة التلقائية: يتم إنشاء فهرس (Index) تلقائياً على المفتاح الأساسي لتسريع البحث.
طريقة 1: تحديد المفتاح الأساسي مع تعريف العمود
تحديد PRIMARY KEY مباشرة
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at DATETIME
);
طريقة 2: تحديد المفتاح الأساسي في نهاية التعريف
تحديد PRIMARY KEY في نهاية الجدول
CREATE TABLE users (
    user_id INT,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at DATETIME,
    PRIMARY KEY (user_id)
);
المفتاح الأساسي التلقائي: AUTO_INCREMENT

في معظم الحالات، نريد أن يتم توليد قيمة المفتاح الأساسي تلقائياً عند إدراج صف جديد. نستخدم AUTO_INCREMENT لهذا الغرض:

استخدام AUTO_INCREMENT
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100),
    created_at DATETIME
);

الآن، عند إدراج مستخدم جديد، لن تحتاج لتحديد user_id يدوياً. سيتم توليده تلقائياً بدءاً من 1، ثم 2، ثم 3، وهكذا.

5. القيود الأساسية (Basic Constraints)

القيود (Constraints) هي قواعد نطبقها على الأعمدة لضمان صحة ودقة البيانات. دعونا نستعرض أهم القيود الأساسية:

NOT NULL - منع القيم الفارغة

القيد NOT NULL يضمن أن العمود يجب أن يحتوي على قيمة، ولا يمكن تركه فارغاً.

استخدام NOT NULL
CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    description TEXT
);

في هذا المثال، product_name و price إلزاميان، بينما description اختياري.

UNIQUE - ضمان القيم الفريدة

القيد UNIQUE يضمن أن جميع القيم في العمود فريدة (لا تكرار).

استخدام UNIQUE
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL
);

هنا، لا يمكن أن يكون هناك مستخدمان بنفس اسم المستخدم أو نفس البريد الإلكتروني.

DEFAULT - القيمة الافتراضية

القيد DEFAULT يحدد قيمة افتراضية للعمود إذا لم يتم تحديد قيمة عند الإدراج.

استخدام DEFAULT
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(100) NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    status VARCHAR(20) DEFAULT 'pending',
    total_amount DECIMAL(10, 2) DEFAULT 0.00
);

في هذا المثال، إذا لم تحدد order_date، سيتم استخدام الوقت الحالي تلقائياً. وإذا لم تحدد status، ستكون القيمة 'pending'.

6. مثال عملي شامل: إنشاء جدول متكامل

لنطبق كل ما تعلمناه في مثال واقعي. سنقوم بإنشاء جدول لنظام إدارة مكتبة إلكترونية:

جدول الكتب - مثال متكامل
CREATE TABLE books (
    -- المفتاح الأساسي التلقائي
    book_id INT PRIMARY KEY AUTO_INCREMENT,
    
    -- معلومات الكتاب الأساسية (إلزامية)
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    isbn VARCHAR(13) UNIQUE NOT NULL,
    
    -- معلومات النشر
    publisher VARCHAR(100),
    publication_year INT,
    edition INT DEFAULT 1,
    
    -- التصنيف والوصف
    category VARCHAR(50) DEFAULT 'General',
    description TEXT,
    
    -- معلومات المخزون
    quantity_available INT DEFAULT 0,
    price DECIMAL(10, 2) NOT NULL,
    
    -- معلومات التتبع
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    -- حالة الكتاب
    is_active BOOLEAN DEFAULT TRUE
);

شرح تفصيلي للجدول:

  • book_id - معرف فريد يتم توليده تلقائياً لكل كتاب
  • title, author - معلومات إلزامية لا يمكن تركها فارغة
  • isbn - رقم ISBN فريد لكل كتاب (لا يمكن تكراره)
  • edition - الطبعة، القيمة الافتراضية 1
  • category - التصنيف، القيمة الافتراضية 'General'
  • created_at - يتم تعيينه تلقائياً عند الإنشاء
  • updated_at - يتم تحديثه تلقائياً عند أي تعديل

7. إنشاء عدة جداول مترابطة

في التطبيقات الحقيقية، نادراً ما نستخدم جدولاً واحداً فقط. دعونا ننشئ مجموعة من الجداول المترابطة لنظام مكتبة كامل:

نظام مكتبة متكامل - عدة جداول
-- 1. جدول الأعضاء
CREATE TABLE members (
    member_id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    phone VARCHAR(20),
    address TEXT,
    membership_date DATE DEFAULT (CURRENT_DATE),
    is_active BOOLEAN DEFAULT TRUE
);

-- 2. جدول الكتب
CREATE TABLE books (
    book_id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    isbn VARCHAR(13) UNIQUE NOT NULL,
    quantity_available INT DEFAULT 0,
    price DECIMAL(10, 2) NOT NULL
);

-- 3. جدول الاستعارات
CREATE TABLE borrowings (
    borrowing_id INT PRIMARY KEY AUTO_INCREMENT,
    member_id INT NOT NULL,
    book_id INT NOT NULL,
    borrow_date DATE DEFAULT (CURRENT_DATE),
    due_date DATE NOT NULL,
    return_date DATE,
    status VARCHAR(20) DEFAULT 'borrowed'
);

هذه الجداول الثلاثة مترابطة منطقياً: الأعضاء يستعيرون الكتب، والاستعارات تربط بين الأعضاء والكتب. في الدروس القادمة، سنتعلم كيفية إنشاء علاقات رسمية بين هذه الجداول باستخدام المفاتيح الخارجية (Foreign Keys).

8. عرض بنية الجدول: DESCRIBE

بعد إنشاء جدول، يمكنك عرض بنيته وتفاصيل أعمدته باستخدام أمر DESCRIBE أو اختصاره DESC:

عرض بنية الجدول
DESCRIBE books;
-- أو
DESC books;
النتيجة
+-------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+----------------+
| book_id | int | NO | PRI | NULL | auto_increment |
| title | varchar(200) | NO | | NULL | |
| author | varchar(100) | NO | | NULL | |
| isbn | varchar(13) | NO | UNI | NULL | |
| price | decimal(10,2)| NO | | NULL | |
+-------------------+--------------+------+-----+---------+----------------+
عرض أمر الإنشاء الكامل
عرض أمر CREATE TABLE الكامل
SHOW CREATE TABLE books;

هذا الأمر يعرض لك الأمر الكامل الذي تم استخدامه لإنشاء الجدول، مفيد جداً لنسخ بنية الجدول أو فهم تفاصيله الدقيقة.

9. التحقق من وجود الجدول: IF NOT EXISTS

مثلما استخدمنا IF NOT EXISTS مع قواعد البيانات، يمكننا استخدامه مع الجداول لتجنب الأخطاء:

إنشاء جدول آمن
CREATE TABLE IF NOT EXISTS users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

هذا الأمر سينشئ الجدول فقط إذا لم يكن موجوداً. إذا كان موجوداً، لن يحدث خطأ ولن يتم تعديل الجدول الموجود.

10. أفضل الممارسات في تصميم الجداول

قواعد ذهبية لتصميم الجداول:
  1. استخدم أسماء واضحة ومعبرة: customer_orders أفضل من table1
  2. كل جدول يجب أن يحتوي على مفتاح أساسي: استخدم AUTO_INCREMENT للمعرفات
  3. استخدم أصغر نوع بيانات مناسب: TINYINT للعمر بدلاً من BIGINT
  4. حدد الأعمدة الإلزامية بـ NOT NULL: لضمان اكتمال البيانات
  5. استخدم UNIQUE للأعمدة الفريدة: مثل البريد الإلكتروني واسم المستخدم
  6. أضف أعمدة التتبع: created_at و updated_at
  7. استخدم DECIMAL للمبالغ المالية: وليس FLOAT
  8. خطط للمستقبل: اترك مجالاً للتوسع في أطوال الأعمدة
أخطاء شائعة يجب تجنبها
❌ خطأ 1: عدم تحديد مفتاح أساسي

كل جدول يجب أن يحتوي على مفتاح أساسي لتحديد الصفوف بشكل فريد.

❌ خطأ 2: استخدام VARCHAR بدون تحديد الطول

يجب دائماً تحديد الطول الأقصى: VARCHAR(100)

❌ خطأ 3: تخزين التواريخ كنصوص

استخدم DATE أو DATETIME بدلاً من VARCHAR

ملخص الدرس

في هذا الدرس الشامل، تعلمنا كيفية إنشاء الجداول باستخدام CREATE TABLE، تحديد الأعمدة وأنواع البيانات، إضافة المفاتيح الأساسية والقيود، وأفضل الممارسات لتصميم جداول احترافية. الآن أصبحت لديك المعرفة الأساسية لإنشاء جداول قوية ومنظمة.

في الدرس القادم، سنتعمق أكثر في القيود (Constraints) المتقدمة مثل المفاتيح الخارجية (Foreign Keys) والقيود المخصصة (CHECK Constraints).

الخطوة التالية: تعديل الجداول (ALTER TABLE)

أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم تعديل الجداول (ALTER TABLE) وتطوير مهاراتك في قواعد البيانات.

الانتقال إلى الدرس التالي
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن