MySQL: دليل تفصيلي لإنشاء جداول وقيود في MySQL
آخر تحديث: 2026-08-26
تُعد الجداول الوحدات الأساسية لتخزين البيانات في قاعدة البيانات — فإذا صممت بنية الجدول بشكل جيد، فأنت قد قطعت نصف الطريق نحو إدارة البيانات بنجاح.
في هذا الدرس، ستتعلم كيفية إنشاء الجداول، وتعيين القيود، وعرض بنيتها.
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. ما ستتعلمه
- الصيغة الكاملة لأمر CREATE TABLE
- قيد المفتاح الأساسي (PRIMARY KEY)
- قيود المفتاح الأجنبي (FOREIGN KEY)
- القيد الفريد (UNIQUE)
- قيد «NOT NULL»
- عرض بنية الجدول
2. قصة حقيقية عن نظام للتجارة الإلكترونية
(1) المشكلة: البيانات غير المنظمة
تحتوي قاعدة بيانات التجارة الإلكترونية على جدول orders فقط، الذي يخزن معلومات العملاء ومعلومات المنتجات على حد سواء:
| رقم_الطلب | اسم_العميل | رقم_هاتف_العميل | اسم_المنتج | سعر_المنتج | الكمية |
|---|---|---|---|---|---|
| 1 | أليس | 13800001111 | آيفون | 999 | 2 |
| 2 | أليس | 13800001111 | MacBook | 1999 | 1 |
| 3 | بوب | 13800002222 | آيفون | 999 | 1 |
السؤال:
- رقم هاتف أليس مدرج ثلاث مرات، لذا فإن تغييره يتطلب تعديل ثلاثة إدخالات.
- لقد قمت بحفظ سعر جهاز iPhone مرتين؛ وإذا ارتفع السعر، فسأضطر إلى تعديل عدة أسطر
- من المستحيل تتبع «عدد الوحدات التي تم بيعها من منتج معين».
(2) طريقة المحلول المعياري
قسّمها إلى 3 جداول واربطها باستخدام المفاتيح الخارجية:
-- 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) الصيغة الكاملة
CREATE TABLE [IF NOT EXISTS] table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
[table_constraints]
) [ENGINE=InnoDB] [DEFAULT CHARSET=utf8mb4];
▶ مثال: إنشاء جدول للمستخدمين
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';
الناتج:
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 |
▶ مثال: استخدام المفاتيح الأساسية
-- 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 | يمنع الحذف من الجدول الأساسي في حالة وجود سجلات في الجدول الأجنبي (الافتراضي) |
| لا إجراء | مثل «مقيد» |
▶ مثال: التسلسل التبعي للمفاتيح الخارجية
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).
▶ مثال: قيد فريد
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» في العمود.
▶ مثال: قيد عدم القيمة الفارغة
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)
▶ مثال: القيمة الافتراضية
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;
الناتج:
+----+-------------------+--------+------------+-------------+---------------------+
| id | title | status | view_count | is_featured | created_at |
+----+-------------------+--------+------------+-------------+---------------------+
| 1 | My First Article | draft | 0 | 0 | 2026-07-03 10:00:00 |
+----+-------------------+--------+------------+-------------+---------------------+
- قيد CHECK (MySQL 8.0 وما بعده)
تضمن قيود CHECK أن قيم الأعمدة تستوفي الشروط المحددة.
▶ مثال: قيد CHECK
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. عرض هياكل الجداول
▶ مثال: عرض معلومات الجدول
-- 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;
الناتج:
+----------------+--------------+------+-----+-------------------+----------------+
| 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 | |
+----------------+--------------+------+-----+-------------------+----------------+
❓ أسئلة شائعة
📖 ملخص
- CREATE TABLE تُنشئ جدولًا؛ ويجب عليك تحديد أسماء الأعمدة وأنواع البيانات والقيود
- المفتاح الأساسي: يُعرِّف المفتاح الأساسي كل صف بشكل فريد؛ ويُوصى باستخدام نوع INT يتزايد تلقائيًا.
- المفتاح الخارجي: يُنشئ علاقات بين الجداول؛ ويدعم الخيارات CASCADE وSET NULL وRESTRICT
- فريد: يضمن القيد الفريد أن تكون قيم الأعمدة فريدة.
- NOT NULL: يضمن قيد NOT NULL عدم تخزين العمود لقيم NULL.
- الافتراضي يتم ملء القيمة الافتراضية تلقائيًا عند الإدراج
- يضمن قيد CHECK (الإصدار 8.0 وما بعده) أن قيم الأعمدة تستوفي الشروط
- DESCRIBE لعرض بنية الجدول؛ SHOW CREATE TABLE لعرض التعريف الكامل
📝 تمارين
-
سؤال أساسي (درجة الصعوبة ⭐): أنشئ جدول
students، الذي يحتوي على الحقول id (مفتاح أساسي يتزايد تلقائيًا)، و name (غير فارغ)، و age (يخضع لفحص CHECK 18-100)، و email (فريد). -
تمرين متقدم (مستوى الصعوبة: ⭐⭐): قم بإنشاء الجدول
coursesوالجدول المرتبط بهstudent_courses(علاقة «كثير إلى كثير»)، وقم بإعداد قيود المفاتيح الخارجية، وتهيئة النظام بحيث يتم حذف سجلات التسجيل في المقررات الدراسية تلقائيًّا عند حذف الطالب. -
التحدي (الصعوبة: ⭐⭐⭐): صمم بنية الجداول لنظام مدونة (المستخدمون، المنشورات، التعليقات، العلامات)، بما في ذلك القيود مثل المفاتيح الأساسية، والمفاتيح الخارجية، وقيود عدم الفراغ، والقيم الافتراضية.