MySQL: دليل تفصيلي لإنشاء جداول وقيود في MySQL

آخر تحديث: 2026-08-26

تُعد الجداول الوحدات الأساسية لتخزين البيانات في قاعدة البيانات — فإذا صممت بنية الجدول بشكل جيد، فأنت قد قطعت نصف الطريق نحو إدارة البيانات بنجاح.

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

100%
graph TB
    A[CREATE TABLE Element] --> B[Column Definition<br/>Field Name+Data Types]
    A --> C[Constraint Definition]
    C --> D[PRIMARY KEY Primary Key]
    C --> E[FOREIGN KEY Foreign Key]
    C --> F[UNIQUE The Only One]
    C --> G[NOT NULL Not empty]
    C --> H[DEFAULT Default value]
    C --> I[CHECK Inspection]
    A --> J[Table Options<br/>ENGINE/CHARSET/COMMENT]

1. ما ستتعلمه



2. قصة حقيقية عن نظام للتجارة الإلكترونية

(1) المشكلة: البيانات غير المنظمة

تحتوي قاعدة بيانات التجارة الإلكترونية على جدول orders فقط، الذي يخزن معلومات العملاء ومعلومات المنتجات على حد سواء:

رقم_الطلب اسم_العميل رقم_هاتف_العميل اسم_المنتج سعر_المنتج الكمية
1 أليس 13800001111 آيفون 999 2
2 أليس 13800001111 MacBook 1999 1
3 بوب 13800002222 آيفون 999 1

السؤال:

(2) طريقة المحلول المعياري

قسّمها إلى 3 جداول واربطها باستخدام المفاتيح الخارجية:

SQL
-- Customer Table
CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    phone VARCHAR(20) UNIQUE
);

-- Product List
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL
);

-- Orders Table
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT DEFAULT 1,
    FOREIGN KEY (customer_id) REFERENCES customers(id),
    FOREIGN KEY (product_id) REFERENCES products(id)
);


3. صيغة الأمر CREATE TABLE

(1) الصيغة الكاملة

SQL
CREATE TABLE [IF NOT EXISTS] table_name (
    column1 datatype [constraints],
    column2 datatype [constraints],
    ...
    [table_constraints]
) [ENGINE=InnoDB] [DEFAULT CHARSET=utf8mb4];

▶ مثال: إنشاء جدول للمستخدمين

SQL
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    age INT CHECK (age >= 0 AND age <= 150),
    status ENUM('active', 'inactive', 'banned') DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='User Table';
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
Query OK, 0 rows affected (0.02 sec)


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

المفتاح الأساسي هو عمود في جدول يُعرِّف كل صف بشكل فريد؛ ولا يمكن تكراره ولا يمكن أن تكون قيمته NULL.

(1) نوع المفتاح الأساسي

النوع الوصف مثال
المفتاح الأساسي أحادي العمود حقل واحد كمفتاح أساسي id INT PRIMARY KEY
المفتاح الأساسي المركب تجميع حقول متعددة لتشكيل مفتاح أساسي PRIMARY KEY (order_id, product_id)
المفتاح الأساسي المتزايد تلقائيًا يُنشئ معرّفًا متزايدًا تلقائيًا id INT AUTO_INCREMENT PRIMARY KEY

▶ مثال: استخدام المفاتيح الأساسية

SQL
-- Single-column primary key
CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

-- Composite Primary Key
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
▶ جرّب الكود

5. قيود المفتاح الأجنبي (FOREIGN KEY)

تُستخدم المفاتيح الخارجية لإنشاء علاقات بين الجداول وضمان سلامة البيانات.

(1) عمليات التسلسل في المفاتيح الخارجية

الإجراء الوصف
CASCADE عند حذف سجل أو تحديثه في الجدول الأساسي، يتم حذف السجل المقابل أو تحديثه في الجدول الثانوي
تعيين القيمة إلى NULL عند حذف الجدول الأساسي، يتم تعيين المفتاح الخارجي في الجدول الثانوي إلى NULL
RESTRICT يمنع الحذف من الجدول الأساسي في حالة وجود سجلات في الجدول الأجنبي (الافتراضي)
لا إجراء مثل «مقيد»

▶ مثال: التسلسل التبعي للمفاتيح الخارجية

SQL
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
        ON DELETE CASCADE
        ON UPDATE CASCADE
);

-- When deleting a customer,All orders for this customer have been automatically deleted.
DELETE FROM customers WHERE id = 1;
-- orders In the table customer_id=1 Records are automatically deleted
▶ جرّب الكود

6. قيد التفرّد (UNIQUE)

يضمن قيد «فريد» أن تكون القيم في العمود فريدة (ولكنه يسمح بالقيم NULL).

▶ مثال: قيد فريد

SQL
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,        -- Single-row, unique
    username VARCHAR(50) UNIQUE,      -- Single-row, unique
    phone VARCHAR(20),
    UNIQUE KEY (phone)                -- Another way to write it
);

-- Composite Unique Constraint
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    UNIQUE KEY (user_id, role_id)    -- The same role cannot be assigned to the same user more than once.
);
▶ جرّب الكود

7. قيد NOT NULL

تضمن قيود «Non-NULL» عدم إمكانية تخزين قيم «NULL» في العمود.

▶ مثال: قيد عدم القيمة الفارغة

SQL
CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,       -- Product Name (Required)
    price DECIMAL(10,2) NOT NULL,     -- Price is required
    description TEXT,                  -- The description may be left blank
    category_id INT NOT NULL
);

-- Insertion Test
INSERT INTO products (name, price) VALUES ('iPhone', 999);
-- Error:category_id Cannot be NULL
-- ERROR 1048 (23000): Column 'category_id' cannot be null
▶ جرّب الكود

8. القيود الافتراضية (DEFAULT)

▶ مثال: القيمة الافتراضية

SQL
CREATE TABLE articles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
    view_count INT DEFAULT 0,
    is_featured BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Omit fields with default values during insertion
INSERT INTO articles (title) VALUES ('My First Article');

-- Search
SELECT * FROM articles;
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+----+-------------------+--------+------------+-------------+---------------------+
| id | title             | status | view_count | is_featured | created_at          |
+----+-------------------+--------+------------+-------------+---------------------+
|  1 | My First Article  | draft  |          0 |           0 | 2026-07-03 10:00:00 |
+----+-------------------+--------+------------+-------------+---------------------+

  1. قيد CHECK (MySQL 8.0 وما بعده)

تضمن قيود CHECK أن قيم الأعمدة تستوفي الشروط المحددة.

▶ مثال: قيد CHECK

SQL
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 18 AND age <= 65),
    salary DECIMAL(10,2) CHECK (salary > 0),
    email VARCHAR(100) CHECK (email LIKE '%@%.%')
);

-- Test
INSERT INTO employees (name, age, salary, email) VALUES ('Alice', 25, 5000, 'alice@company.com');
-- Error:age Not satisfied CHECK Conditions
INSERT INTO employees (name, age, salary, email) VALUES ('Bob', 15, 3000, 'bob@company.com');
-- ERROR 3819: Check constraint 'employees_chk_1' is violated.
▶ جرّب الكود

9. عرض هياكل الجداول

▶ مثال: عرض معلومات الجدول

SQL
-- View all tables in the current database
SHOW TABLES;

-- View Table Structure
DESCRIBE users;
-- Or
DESC users;

-- View the statement used to create the table
SHOW CREATE TABLE users\G

-- View the table's column information
SHOW COLUMNS FROM users;
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+----------------+--------------+------+-----+-------------------+----------------+
| Field          | Type         | Null | Key | Default           | Extra          |
+----------------+--------------+------+-----+-------------------+----------------+
| id             | int          | NO   | PRI | NULL              | auto_increment |
| username       | varchar(50)  | NO   | UNI | NULL              |                |
| email          | varchar(100) | NO   |     | NULL              |                |
| password_hash  | varchar(255) | NO   |     | NULL              |                |
| age            | int          | YES  |     | NULL              |                |
| status         | enum(...)    | YES  |     | active            |                |
| created_at     | timestamp    | YES  |     | CURRENT_TIMESTAMP |                |
| updated_at     | timestamp    | YES  |     | CURRENT_TIMESTAMP |                |
+----------------+--------------+------+-----+-------------------+----------------+


❓ أسئلة شائعة

س هل يجب أن يكون المفتاح الأساسي من نوع INT ذات التزايد التلقائي أم UUID؟
ج نوصي باستخدام INT أو BIGINT ذات التزايد التلقائي (لتحقيق أداء أفضل وتقليل الحجم المطلوب للتخزين). تعتبر UUIDs مناسبة للسيناريوهات الموزعة، لكنها قد تقلل من أداء الفهرس.
س هل يمكن أن يحتوي الجدول على عدة قيود UNIQUE؟
ج نعم. يمكن أن يحتوي الجدول على عدة قيود UNIQUE، ولكنه لا يمكن أن يحتوي إلا على مفتاح أساسي واحد (PRIMARY KEY).
س هل تؤثر المفاتيح الخارجية على الأداء؟
ج لها تأثير طفيف (حيث يجب التحقق من القيود عند كل عملية كتابة)، لكنها تضمن سلامة البيانات. وفي حالات التزامن العالي، يمكن إجراء عمليات التحقق على مستوى طبقة التطبيق.
س ما الفرق بين NULL والسلسلة الفارغة؟
ج تعني NULL «لا توجد قيمة»، في حين أن السلسلة الفارغة '' تُعد قيمة. لا يمكنك مقارنة NULL باستخدام علامة التساوي =؛ بل يجب عليك استخدام IS NULL.
س هل يجب أن تكون أسماء الجداول بصيغة المفرد أم الجمع؟
ج نوصي باستخدام صيغة الجمع (users، orders) للإشارة إلى «مجموعة من السجلات». فقط احرص على الحفاظ على أسلوب موحد في جميع أنحاء المشروع.

📖 ملخص


📝 تمارين

  1. سؤال أساسي (درجة الصعوبة ⭐): أنشئ جدول students، الذي يحتوي على الحقول id (مفتاح أساسي يتزايد تلقائيًا)، و name (غير فارغ)، و age (يخضع لفحص CHECK 18-100)، و email (فريد).

  2. تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بإنشاء الجدول courses والجدول المرتبط به student_courses (علاقة «كثير إلى كثير»)، وقم بإعداد قيود المفاتيح الخارجية، وتهيئة النظام بحيث يتم حذف سجلات التسجيل في المقررات الدراسية تلقائيًّا عند حذف الطالب.

  3. التحدي (الصعوبة: ⭐⭐⭐): صمم بنية الجداول لنظام مدونة (المستخدمون، المنشورات، التعليقات، العلامات)، بما في ذلك القيود مثل المفاتيح الأساسية، والمفاتيح الخارجية، وقيود عدم الفراغ، والقيم الافتراضية.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%