طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 121 · مبادئ قواعد البيانات
الدرس 9 · الوحدة 5: تصميم الجداول والعلاقات

إنشاء الجداول: CREATE TABLE

نحوّل الكيان إلى جدول حقيقي: أعمدة وأنواع ومفاتيح. ⏱ نحو 25 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تكتب أمر CREATE TABLE بأعمدة وأنواع وقيود.
  • تختار نوع البيانات المناسب، وتعرف مقابله في MySQL.
  • تستخدم الترقيم التلقائي والمفتاح المركّب.
  • تحذف الجداول وتنشئها بأمان بـ IF EXISTS.

١شكل الأمر

من المخطط إلى القاعدة: كل كيان يصير جدولًا بأمر CREATE TABLE. نكتب اسم الجدول، ثم بين قوسين كل عمود: اسمه، ونوع بياناته، وقيوده، وبين الأعمدة فواصل:

query.sql
CREATE TABLE courses (  id      INTEGER PRIMARY KEY,  code    TEXT NOT NULL UNIQUE,  title   TEXT NOT NULL,  hours   INTEGER CHECK (hours BETWEEN 1 AND 6)); -- عرض أعمدة الجدول الجديدPRAGMA table_info(courses);
النتيجة · 4 صفوف
cidnametypenotnulldflt_valuepk
0idINTEGER0NULL1
1codeTEXT1NULL0
2titleTEXT1NULL0
3hoursINTEGER0NULL0

PRAGMA table_info أمر SQLite يعرض بنية الجدول. ومقابله في MySQL: DESCRIBE courses;

٢أنواع البيانات

نوع البيانات يحدد ما يقبله العمود، وكم مساحة يأخذ، وكيف يُرتَّب ويُقارَن. أهم الأنواع، في SQLite وما يقابلها في MySQL:

البياناتSQLiteMySQLمثال
عدد صحيحINTEGERINT، BIGINTالكمية، سنة الميلاد
عدد عشري تقريبيREALFLOAT، DOUBLEقراءة حساس
مبلغ مالي دقيقNUMERICDECIMAL(10,2)السعر، الراتب
نص قصيرTEXTVARCHAR(100)الاسم، البريد
نص طويلTEXTTEXTوصف المنتج
تاريخTEXT 'YYYY-MM-DD'DATE'2025-05-12'
تاريخ ووقتTEXTDATETIME'2025-05-12 14:30:00'
نعم/لاINTEGER (0 أو 1)BOOLEANمتوفر؟

٣المفتاح الأساسي والترقيم التلقائي

العمود INTEGER PRIMARY KEY في SQLite يرقّم نفسه تلقائيًّا إن لم نعطه قيمة. وفي MySQL نكتب AUTO_INCREMENT:

query.sql
CREATE TABLE tickets (  id    INTEGER PRIMARY KEY,  title TEXT NOT NULL);INSERT INTO tickets (title) VALUES ('الطابعة لا تعمل');INSERT INTO tickets (title) VALUES ('نسيت كلمة المرور');SELECT * FROM tickets;
النتيجة · صفّان
idtitle
1الطابعة لا تعمل
2نسيت كلمة المرور

لم نكتب الرقم، فأعطى النظام 1 ثم 2.

mysql.sql
-- الجدول نفسه في MySQLCREATE TABLE tickets (  id    INT AUTO_INCREMENT PRIMARY KEY,  title VARCHAR(200) NOT NULL);

وقد يتكون المفتاح الأساسي من عمودين معًا (مفتاح مركّب)، كما في جدول التسجيل: الطالب نفسه لا يتكرر مع المقرر نفسه، ويُكتب المفتاح في سطر مستقل بعد الأعمدة:

query.sql
CREATE TABLE attendance (  student_id INTEGER,  lecture_no INTEGER,  present    INTEGER DEFAULT 1,  PRIMARY KEY (student_id, lecture_no));INSERT INTO attendance VALUES (1001, 1, 1);INSERT INTO attendance VALUES (1001, 2, 0);INSERT INTO attendance VALUES (1001, 1, 1);
✓ أُضيف صف واحد
✗ خطأ (السطر 9): مخالفة قيد UNIQUE: القيمة مكررة في attendance.student_id, attendance.lecture_no

الصف الثالث يكرر الطالب والمحاضرة نفسيهما، فرُفض.

٤حذف الجدول وإنشاؤه بأمان

DROP TABLE يحذف الجدول ببياناته كلها، بلا سؤال ولا سلة محذوفات. والإضافة IF EXISTS و IF NOT EXISTS تمنعان الخطأ إن كان الجدول غير موجود أو موجودًا من قبل:

query.sql
CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT);CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT);  -- لا خطأ DROP TABLE IF EXISTS notes;DROP TABLE IF EXISTS notes;  -- لا خطأ SELECT name FROM sqlite_master WHERE type = 'table';
النتيجة · لا صفوف
name
(لا توجد صفوف تحقق الشرط)

لا توجد جداول بعد الحذف، فالنتيجة فارغة.

توقّع وتحقّق

أنسب نوع للسعر في MySQL:

دقة المال.

الترقيم التلقائي في MySQL:

مع INT PRIMARY KEY.

أي اسم عمود أفضل؟

إنجليزي صغير بشرطة سفلية.

أمر MySQL لعرض بنية الجدول:

DESCRIBE table;

الخلاصة

تحدٍّ برمجي: جدول الكتب

متوسط

أنشئ جدول كتب لمكتبة الكلية، ثم أضف كتابين وتأكد منهما.

المطلوب:
  • اسم الجدول books بالأعمدة بهذا الترتيب: isbn (نص، مفتاح أساسي)، و title (نص إلزامي)، و pub_year (عدد صحيح)، و price (عدد أكبر من صفر)، و available (عدد صحيح افتراضيًّا 1).
  • أضف كتابين بأي بيانات صحيحة، ثم اعرض الجدول.
👀 اعرض النتيجة المطلوبة
بعد التنفيذ: SELECT name FROM pragma_table_info('books') ORDER BY cid
name
isbn
title
pub_year
price
available
بعد التنفيذ: SELECT COUNT(*) FROM books
COUNT(*)
2
بعد التنفيذ: INSERT INTO books (isbn, title, price) VALUES ('978-7', 'اختبار', 5); SELECT available FROM books WHERE isbn = '978-7'
available
1
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء
  • الأعمدة الخمسة بأسمائها وترتيبها
  • في الجدول كتابان
  • يرفض كتابًا بلا عنوان
  • يرفض ISBN مكررًا
  • يرفض سعرًا صفرًا
  • الكتاب الجديد متوفر افتراضيًّا (1)

💡 تلميح 1
ابدأ بمثال courses في القسم 1 وعدّل الأعمدة.
💡 تلميح 2
INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-1', 'عنوان', 2024, 50);

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

solution.sql
CREATE TABLE books (  isbn      TEXT PRIMARY KEY,  title     TEXT NOT NULL,  pub_year  INTEGER,  price     REAL CHECK (price > 0),  available INTEGER DEFAULT 1); INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-1', 'مقدمة في قواعد البيانات', 2020, 85);INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-2', 'تعلم SQL', 2023, 60); SELECT * FROM books;
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس