تخطَّ إلى المحتوى

إنشاء الجداول في SQL: CREATE TABLE والقيود

الدرس 2 من 12 · SQL

قبل أن تخزّن أي بيانات، تحتاج جدولاً يستقبلها. وتصميم الجدول جيداً من البداية يوفر عليك مشاكل كثيرة لاحقاً: بيانات ناقصة، أو مكررة، أو غير منطقية. في هذا الدرس ستتعلم كيف تنشئ جدولاً، وكيف تضع له قواعد يحرسها نظام قاعدة البيانات بنفسه.

CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER,
city TEXT DEFAULT 'القاهرة',
email TEXT UNIQUE
);

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

تخيّل الجدول مثل استمارة تسجيل مطبوعة: إنشاء الجدول هو تصميم الاستمارة نفسها، بخاناتها وقواعدها: «هذه الخانة إجبارية»، «هذه الخانة أرقام فقط». أما كل طالب يملأ الاستمارة فهو صف جديد في الجدول.

النوع يخزن مثال
INTEGER أعداد صحيحة 14
REAL أعداد عشرية 85.5
TEXT نصوص 'سارة'
DATE تاريخ '2026-11-10'

id INTEGER PRIMARY KEY يجعل العمود id مفتاحاً أساسياً: رقماً فريداً يميز كل صف عن غيره، ولا يمكن تكراره أبداً.

لماذا نحتاجه؟ قد يكون في المدرسة طالبتان اسم كل منهما «سارة»، وعمرهما 14، ومن نفس المدينة! كيف نميز بينهما؟ بالرقم الفريد، تماماً مثل الرقم القومي أو رقم القيد في المدرسة.

القيود قواعد يفرضها النظام على البيانات تلقائياً:

  • NOT NULL: الخانة إجبارية، لا تُترك فارغة.
  • UNIQUE: لا يتكرر نفس القيمة في صفين، مثل البريد الإلكتروني.
  • DEFAULT: قيمة تلقائية إذا لم تُعطَ قيمة.

لنجرب إضافة صف:

INSERT INTO students (id, name, age, email) VALUES (1, 'سارة', 14, '[email protected]');
SELECT * FROM students;

الناتج:

id name age city email
1 سارة 14 القاهرة [email protected]

لاحظ أن city أخذت القاهرة تلقائياً من DEFAULT، لأننا لم نعطها قيمة. (ستتعلم INSERT بالتفصيل في درس قادم.)

الآن جرّب كسر القواعد. طالب بلا اسم:

INSERT INTO students (id, age) VALUES (2, 15);

الناتج: NOT NULL constraint failed: students.name

بريد مكرر:

INSERT INTO students (id, name, email) VALUES (3, 'منى', '[email protected]');

الناتج: UNIQUE constraint failed: students.email

مفتاح أساسي مكرر:

INSERT INTO students (id, name) VALUES (1, 'عمر');

الناتج: UNIQUE constraint failed: students.id

في كل مرة رفض النظام البيانات الخاطئة ولم يحفظها. هذه هي قوة القيود: بدلاً من أن تفحص كل البيانات في برنامجك، قاعدة البيانات نفسها تمنع الأخطاء. (نصوص رسائل الخطأ هنا من SQLite، وتختلف صياغتها قليلاً في الأنظمة الأخرى.)

نسيت عموداً؟ أضفه دون حذف الجدول:

ALTER TABLE students ADD COLUMN phone TEXT;
SELECT id, name, phone FROM students;

الناتج:

id name phone
1 سارة NULL

العمود الجديد أُضيف للصفوف الموجودة بقيمة NULL، أي «لا قيمة».

DROP TABLE students;

هذا الأمر يحذف الجدول وكل بياناته نهائياً، دون سؤال ولا تأكيد!

  • أسماء واضحة بالإنجليزية وبحروف صغيرة: students و first_name، بلا مسافات.
  • مفتاح أساسي لكل جدول، وغالباً اسمه id.
  • NOT NULL للبيانات الضرورية فقط، فلا تجعل كل شيء إجبارياً.
  • عمود لكل معلومة: لا تضع الاسم والعمر في خانة واحدة.

صمم جدولاً لمكتبة المدرسة باسم books، فيه:

  1. id مفتاح أساسي.
  2. title نص إجباري.
  3. author نص.
  4. pages رقم صحيح.
  5. available رقم صحيح قيمته الافتراضية 1 (أي متاح).

ثم أضف كتابين، وجرّب إضافة كتاب بلا عنوان ولاحظ الخطأ. يمكنك التجربة مجاناً في أي محرر SQL على الإنترنت يدعم SQLite.

  • فاصلة بعد آخر عمود: email TEXT UNIQUE,) خطأ صياغة. آخر عمود بلا فاصلة.
  • نسيان المفتاح الأساسي: بدونه يصعب تعديل صف محدد أو حذفه لاحقاً.
  • علامات تنصيص مزدوجة للنصوص: في SQL القياسية، النصوص بين علامتين مفردتين 'سارة'.

سؤال

ما وظيفة القيد NOT NULL على عمود؟

سؤال

لماذا نحتاج المفتاح الأساسي PRIMARY KEY؟

  • CREATE TABLE ينشئ جدولاً بأعمدة لكل منها اسم ونوع وقيود.
  • الأنواع الأساسية: INTEGER و REAL و TEXT و DATE، وتختلف أسماؤها قليلاً بين الأنظمة.
  • PRIMARY KEY رقم فريد لكل صف، و NOT NULL و UNIQUE و DEFAULT قيود تحرس البيانات.
  • ALTER TABLE ... ADD COLUMN لإضافة عمود، و DROP TABLE يحذف الجدول نهائياً.
  • القيود تجعل قاعدة البيانات نفسها ترفض البيانات الخاطئة.