في هذا الدرس 6تصفّح المواضيع
تسمح أعمدة الجداول في MySQL افتراضياً بتخزين العلامة الخاصة NULL التي تعني غياب القيمة أو عدم معرفتها. وعند إضافة قيد NOT NULL بعد نوع بيانات العمود مباشرةً، يرفض محرك InnoDB أي عملية تترك هذا العمود فارغاً ويُظهر الخطأ القياسي Error 1048: Column cannot be null:
- اكتمال البيانات الأساسية: يضمن عدم حفظ سجلات تفتقر إلى الحقول الجوهرية مثل البريد الإلكتروني أو اسم المنتج أو السعر.
- تحسين التخزين والفهرسة: يوفر محرك InnoDB بايتات رايات الفراغ (NULL Bitmask) عندما يكون العمود معرَّفاً بقيد
NOT NULL. - الفرق بين NULL والنص الفارغ: تعني
NULLغياب القيمة تماماً، بينما يُعد النص الفارغ''سلسلة نصية فعلية طولها صفر.
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 مطلقاً مع إعفاء المبرمج من تمرير القيم البديهية المتكررة يدوياً.
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 بكائن فارغ صالح{}.
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:
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:
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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
- التوقيت العالمي المنسق المعتمد مرجعاً قياسياً عند تسجيل الطوابع الزمنية الافتراضية في قواعد البيانات.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم الأعمدة الإلزامية بقيد NOT NULL داخل قاعدة بياناتك المحلية وتحقق من النتيجة.
-
بدّل بين الحالات التفاعلية في قسم القيم الافتراضية الثابتة DEFAULT وقارن كيف يعالج محرك MySQL 8 كل أمر.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي6 أسئلة تنتظرك +
ماذا يحدث في الوضع الصارم لخادم MySQL 8 عند محاولة تخزين قيمة NULL داخل عمود معرَّف بقيد NOT NULL؟
يرفض محرك MySQL 8 العملية فوراً ويُظهر الخطأ رقم 1048 لأن العمود لا يقبل الفراغ.
في قواعد بيانات MySQL، تُعد العلامة NULL مطابقة تماماً للنص الفارغ ('') وللرقم 0.
خطأ؛ لأن NULL تعني غياب القيمة أصلاً، بينما النص الفارغ سلسلة طولها صفر والرقم 0 قيمة حسابية.
أي تعريف عمود مما يلي يضمن عدم قبول القيمة NULL مطلقاً وتعيين القيمة 0 تلقائياً عند إغفال العمود؟
الجمع بين NOT NULL وDEFAULT 0 يمنع الفراغ ويسند الصفر تلقائياً.
كيف يجب كتابة التعبيرات الافتراضية المبنية على الدوال مثل UUID() أو JSON_OBJECT() في MySQL 8؟
يجب إحاطة التعبير الدالي بقوسين خارجيين بعد كلمة DEFAULT مثل: DEFAULT (UUID()).
أي صيغة في أمر ALTER TABLE تغيّر القيمة الافتراضية للعمود مباشرةً دون الحاجة لإعادة كتابة نوع بياناته؟
صيغة ALTER COLUMN col_name SET DEFAULT تعدل القيمة الافتراضية في قاموس البيانات لحظياً.
عندما يُظهر أمر DESCRIBE القيمة "NO" تحت عمود Null، فهذا يعني أن العمود محمي بقيد NOT NULL.
صواب؛ القيمة NO تحت حقل Null تؤكد أن العمود لا يقبل تخزين NULL.