انتقل إلى محتوى الدرس
الدرس 16
دورة MySQL

قيدا منع الفراغ NOT NULL والقيمة الافتراضية DEFAULTMySQL NOT NULL and DEFAULT Constraints

تعلّم قيدا منع الفراغ NOT NULL والقيمة الافتراضية DEFAULT بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تسمح أعمدة الجداول في MySQL افتراضياً بتخزين العلامة الخاصة NULL التي تعني غياب القيمة أو عدم معرفتها. وعند إضافة قيد NOT NULL بعد نوع بيانات العمود مباشرةً، يرفض محرك InnoDB أي عملية تترك هذا العمود فارغاً ويُظهر الخطأ القياسي Error 1048: Column cannot be null:

  • اكتمال البيانات الأساسية: يضمن عدم حفظ سجلات تفتقر إلى الحقول الجوهرية مثل البريد الإلكتروني أو اسم المنتج أو السعر.
  • تحسين التخزين والفهرسة: يوفر محرك InnoDB بايتات رايات الفراغ (NULL Bitmask) عندما يكون العمود معرَّفاً بقيد NOT NULL.
  • الفرق بين NULL والنص الفارغ: تعني NULL غياب القيمة تماماً، بينما يُعد النص الفارغ '' سلسلة نصية فعلية طولها صفر.
مخطط يوضح قيد منع الفراغ NOT NULL والقيمة الافتراضية الثابتة والتعبيرات الديناميكية في MySQL 8
SQL
CREATE TABLE customers (
    full_name VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    phone_number VARCHAR(25) NULL,
    notes TEXT NULL
);

يحدد قيد DEFAULT قيمة احتياطية تُسند إلى العمود تلقائياً عند إنشاء سجل جديد دون ذكر هذا العمود. ويُعد الجمع بين NOT NULL وDEFAULT من أفضل ممارسات تصميم الجداول؛ إذ يضمن عدم دخول NULL مطلقاً مع إعفاء المبرمج من تمرير القيم البديهية المتكررة يدوياً.

SQL
CREATE TABLE store_items (
    item_title VARCHAR(120) NOT NULL,
    stock_qty INT NOT NULL DEFAULT 0,
    status VARCHAR(20) NOT NULL DEFAULT 'available',
    tax_rate DECIMAL(4, 2) NOT NULL DEFAULT 15.00
);

قبل الإصدار 8.0.13 لم يكن MySQL يقبل القيم الافتراضية الديناميكية إلا لأعمدة الوقت عبر CURRENT_TIMESTAMP. أما في MySQL 8 الحديث فيمكن لأي عمود استخدام تعبير افتراضي ديناميكي يوضع بين قوسين بالصيغة DEFAULT (...):

  • الطابع الزمني اللحظي CURRENT_TIMESTAMP: يسجل تاريخ ووقت إنشاء الصف تلقائياً.
  • المعرّف العالمي DEFAULT (UUID()): يولّد سلسلة UUID فريدة بطول 36 محرفاً لكل سجل جديد.
  • تهيئة حقول JSON عبر DEFAULT (JSON_OBJECT()): يهيئ عمود JSON بكائن فارغ صالح {}.
SQL
CREATE TABLE session_tokens (
    token_uuid CHAR(36) NOT NULL DEFAULT (UUID()),
    meta_payload JSON NOT NULL DEFAULT (JSON_OBJECT()),
    issued_date DATE NOT NULL DEFAULT (CURRENT_DATE),
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

يمكنك فرض قيد NOT NULL أو إلغاؤه على عمود قائم باستخدام أمر ALTER TABLE ... MODIFY COLUMN مع إعادة كتابة نوع البيانات الكامل للعمود، أو الاكتفاء بتغيير القيمة الافتراضية وحدها بسرعة فائقة عبر الصيغة القياسية ALTER COLUMN ... SET DEFAULT:

SQL
ALTER TABLE store_items
    MODIFY COLUMN item_title VARCHAR(150) NOT NULL,
    ALTER COLUMN status SET DEFAULT 'in_stock';

ALTER TABLE store_items
    ALTER COLUMN tax_rate DROP DEFAULT;

قبل تعديل أي جدول، يمكنك التحقق من حالة عمود Null (NO تعني محمي بقيد NOT NULL) وقيمة عمود Default وعمود Extra عبر أمري الفحص المباشرين DESCRIBE وSHOW CREATE TABLE:

SQL
DESCRIBE store_items;

SHOW CREATE TABLE session_tokens;

يلخص الجدول المقارن التالي الفروق الهندسية بين حالات الفراغ والقيم الافتراضية في MySQL 8:

نمط تعريف العمودهل يقبل NULL؟السلوك عند إغفال العمودالاستخدام العملي الأنسب
NULL (السلوك الافتراضي)نعميخزن NULL تلقائياًالملاحظات الاختيارية والهاتف الثانوي
NOT NULL بدون DEFAULTلايرفض العملية في الوضع الصارم (خطأ 1048)البريد الإلكتروني واسم المستخدم وكلمة المرور
NOT NULL DEFAULT valلايخزن القيمة الثابتة المحددةحالة الطلب والعدادات الرقمية (DEFAULT 0)
NOT NULL DEFAULT (expr)لايحسب التعبير الدالي لحظياً لكل صفمعرّفات (UUID()) وتاريخ الإنشاء

ملخص الدرس: تعلمت في هذا الدرس كيف يمنع قيد NOT NULL تخزين القيم المجهولة، وكيف يوفر قيد DEFAULT الثابت أو التعبيري في MySQL 8 قيماً تلقائية للأعمدة، وكيفية تعديلها وفحصها بأوامر ALTER TABLE وDESCRIBE.
الخطوة التالية والدرس القادم: انتقل إلى الدرس التالي لتعلّم قيد التفرد UNIQUE لمنع تكرار القيم مثل البريد الإلكتروني ورموز المنتجات داخل الجدول.

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

يشكّل الدمج بين قيدي NOT NULL وDEFAULT خط الدفاع الأول عن اكتمال السجلات داخل محرك InnoDB. الخطوة التالية: انتقل الآن إلى درس «قيد التفرد UNIQUE ومنع تكرار القيم في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات5

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 5 مفهومةأول بطاقة، أول خطوة
01 NOT NULL منع الفراغ
تعلّم قيدا منع الفراغ NOT NULL والقيمة الافتراضية DEFAULT بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Mandatory Columns with NOT NULL الأعمدة الإلزامية بقيد NOT NULL
المفهوم الهندسي والصياغة العملية الخاصة بقسم الأعمدة الإلزامية بقيد NOT NULL في MySQL 8.
للمراجعة
03 Literal DEFAULT Column Values القيم الافتراضية الثابتة DEFAULT
المفهوم الهندسي والصياغة العملية الخاصة بقسم القيم الافتراضية الثابتة DEFAULT في MySQL 8.
للمراجعة
04 Expression Defaults in MySQL 8 تعبيرات DEFAULT في MySQL 8
المفهوم الهندسي والصياغة العملية الخاصة بقسم تعبيرات DEFAULT في MySQL 8 في MySQL 8.
للمراجعة
05 Altering Column Constraints تعديل قيود الأعمدة بـ ALTER
المفهوم الهندسي والصياغة العملية الخاصة بقسم تعديل قيود الأعمدة بـ ALTER في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 DDL DDL
Data Definition Language
أوامر تعريف البيانات في SQL مثل CREATE TABLE وALTER TABLE المستخدمة لبناء الجداول وفرض القيود.
للمراجعة
02 NULL NULL
SQL Null Marker (Missing / Unknown Value)
علامة خاصة في SQL تمثل غياب القيمة أو عدم معرفتها وتختلف كلياً عن الصفر أو النص الفارغ.
للمراجعة
03 UUID UUID
Universally Unique Identifier
معرّف فريد عالمياً بطول 36 محرفاً يمكن توليده تلقائياً في MySQL 8 عبر التعبير DEFAULT (UUID()).
للمراجعة
04 UTC UTC
Coordinated Universal Time
التوقيت العالمي المنسق المعتمد مرجعاً قياسياً عند تسجيل الطوابع الزمنية الافتراضية في قواعد البيانات.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم الأعمدة الإلزامية بقيد NOT NULL داخل قاعدة بياناتك المحلية وتحقق من النتيجة.

  2. بدّل بين الحالات التفاعلية في قسم القيم الافتراضية الثابتة DEFAULT وقارن كيف يعالج محرك MySQL 8 كل أمر.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

6أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي6 أسئلة تنتظرك
01

ماذا يحدث في الوضع الصارم لخادم MySQL 8 عند محاولة تخزين قيمة NULL داخل عمود معرَّف بقيد NOT NULL؟

يرفض محرك MySQL 8 العملية فوراً ويُظهر الخطأ رقم 1048 لأن العمود لا يقبل الفراغ.

02

في قواعد بيانات MySQL، تُعد العلامة NULL مطابقة تماماً للنص الفارغ ('') وللرقم 0.

خطأ؛ لأن NULL تعني غياب القيمة أصلاً، بينما النص الفارغ سلسلة طولها صفر والرقم 0 قيمة حسابية.

03

أي تعريف عمود مما يلي يضمن عدم قبول القيمة NULL مطلقاً وتعيين القيمة 0 تلقائياً عند إغفال العمود؟

الجمع بين NOT NULL وDEFAULT 0 يمنع الفراغ ويسند الصفر تلقائياً.

04

كيف يجب كتابة التعبيرات الافتراضية المبنية على الدوال مثل UUID() أو JSON_OBJECT() في MySQL 8؟

يجب إحاطة التعبير الدالي بقوسين خارجيين بعد كلمة DEFAULT مثل: DEFAULT (UUID()).

05

أي صيغة في أمر ALTER TABLE تغيّر القيمة الافتراضية للعمود مباشرةً دون الحاجة لإعادة كتابة نوع بياناته؟

صيغة ALTER COLUMN col_name SET DEFAULT تعدل القيمة الافتراضية في قاموس البيانات لحظياً.

06

عندما يُظهر أمر DESCRIBE القيمة "NO" تحت عمود Null، فهذا يعني أن العمود محمي بقيد NOT NULL.

صواب؛ القيمة NO تحت حقل Null تؤكد أن العمود لا يقبل تخزين NULL.