قاعدة بيانات أوراكل / الأساسي: أسس العلاقات والمعاملات / الدرس 2
الأنواع والقيم الغائبة وقيود السلامة
مثّل حقائق الشحن بدلالات أوراكل الخاصة بالأرقام والمحارف والوقت.
في هذه الصفحة
أهداف الدرس
- اختر أنواعاً دقيقة وقواعد صريحة لوجود القيم.
- اشرح السلاسل الفارغة وCHECK والهوية المولدة.
اختر الأنواع وفق عقد العمل
رمز التتبع نص حتى لو احتوى أرقاماً فقط؛ للأصفار البادئة معنى ولا تُجرى عليه حسابات. يناسب NUMBER(9,2) رسماً مالياً دقيقاً محدود النطاق، بينما تستخدم الأعداد الثنائية العائمة تمثيلاً تقريبياً. استخدم VARCHAR2 عمداً للمحارف متغيرة الطول، وحدد دلالة BYTE أو CHAR للأسماء الدولية، إذ قد يشغل المحرف عدة بايتات في ترميز القاعدة. لا تفترض أن تعريفاً ورث إعداد طول NLS في جلسة مطور سيحمل المعنى نفسه لدى كل مشغّل ترحيل.
النص الفارغ يُعامل حالياً كقيمة NULL
تعامل أوراكل حالياً السلسلة المحرفية ذات الطول صفر كقيمة NULL. لذلك لا يمكن لعمود VARCHAR2 إلزامي تخزين نص فارغ كقيمة معروفة مستقلة. المسافة الواحدة مختلفة، وتعويض القيم بمسافات يخفي مشاكل الجودة. تعني NULL قيمة مجهولة أو غائبة؛ لذلك تكون المساواة المعتادة معها مجهولة لا صحيحة. يحتفظ WHERE بالشروط الصحيحة فقط. استخدم IS NULL للغياب وصرّح بقواعد القيم البديلة. تستهدف الدورة دلالات SQL الراسخة في 19c؛ وللإصدارات الأحدث وقيم JSON غير المحرفية قواعد موثقة مستقلة.
SELECT CASE WHEN '' IS NULL THEN 'missing' ELSE 'present' END AS empty_text,
CASE WHEN ' ' IS NULL THEN 'missing' ELSE 'present' END AS space_text
FROM dual;
EMPTY_TEXT | SPACE_TEXT
missing | present
السلسلة عديمة الطول NULL، أما المسافة الواحدة فتبقى قيمة محرفية.
افصل الضمانات الأربعة
يفصل التعريف توليد الهوية والتفرّد وإلزامية الوجود والمجال المسموح. تولّد الهوية قيماً بديلة، ويعبّر PRIMARY KEY عن التفرّد. لا يرفض CHECK (charge >= 0) قيمة NULL لأن نتيجة الفحص المجهولة مسموحة؛ يضيف NOT NULL قاعدة الوجود. رمز التتبع الفريد مفتاح أعمال مستقل. تحمي القيود كل الكتّاب، بما في ذلك سكربت استيراد مستقبلي؛ فلا تُحذف لمجرد أن نموذج الويب يتحقق من الحقول نفسها. يخص المثال مخططاً تعليمياً مؤقتاً، وليس أمراً بتعديل تطبيق قائم.
CREATE TABLE shipments (
shipment_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tracking_code VARCHAR2(24 CHAR) NOT NULL UNIQUE,
charge NUMBER(9,2) NOT NULL CHECK (charge >= 0),
dispatched_at TIMESTAMP WITH TIME ZONE
);
تتوفر أعمدة الهوية من 12c. القيم معرّفات ولا يلزم أن تكون متتالية؛ وإنشاء الجدول DDL له آثار التثبيت الضمني.
يتضمن DATE مكوّناً زمنياً
يخزّن DATE في أوراكل السنة حتى الثانية، لا يوم التقويم فقط. يضيف TIMESTAMP كسور الثانية؛ ويمثل TIMESTAMP WITH TIME ZONE الوقت مع معلومات المنطقة، بينما يطبّع WITH LOCAL TIME ZONE التخزين ويعرض بحسب منطقة الجلسة. اختر وفق معنى الحدث لا تنسيق العرض. لا يعتمد DATE '2026-10-01' على NLS_DATE_FORMAT ويشير إلى منتصف الليل. مقارنته بالمساواة مع وقت بعد الظهر تستبعد الصف. تستخدم دروس التصفية اللاحقة نطاقات نصف مفتوحة لتمثيل اليوم كاملاً.
نمذج العلاقات واختياريتها معاً
يشير المفتاح الخارجي إلى مفتاح أب أساسي أو فريد ويمنع المراجع اليتيمة. مع ذلك يسمح مفتاح الابن القابل لـNULL بغياب العلاقة؛ أضف NOT NULL إذا احتاجت كل شحنة عميلاً. راجع فهرسة جهة الابن للربط وتغييرات مفتاح الأب، ولا تفترض أن القيد ينشئ فهرساً مناسباً تلقائياً. اختر سلوك الحذف وفق دورة الحياة: قد يلزم منع حذف العميل مع بقاء شحناته التاريخية. لا تعطّل السلامة المرجعية لإظهار نجاح الاستيراد؛ اعزل السجلات غير الصالحة وأصلح مصدرها.
الأخطاء الشائعة وإصلاحها
ORA-01400
- لماذا يحدث؟
- تلقى حقل إلزامي NULL، بما فيه سلسلة VARCHAR2 فارغة.
- كيف تصلحه؟
- قدّم قيمة ذات معنى أو راجع عقد الاختيارية صراحة.
- كيف تتجنب تكراره؟
- اختبر الإدخال الفارغ بعد إزالة المسافات واحتفظ بسبب رفض المصدر.
ORA-02290
- لماذا يحدث؟
- ينتهك الصف الجديد قيد CHECK مسمى.
- كيف تصلحه؟
- افحص قاعدة المجال الدقيقة وأصلح قيمة المصدر.
- كيف تتجنب تكراره؟
- سمّ القيود واختبر الحدود بما فيها الصفر والقيم الغائبة.
ORA-12899
- لماذا يحدث؟
- تتجاوز القيمة سعة البايتات أو المحارف المعلنة.
- كيف تصلحه؟
- قارن الطول المشفر بدلالة العمود الفعلية.
- كيف تتجنب تكراره؟
- حدّد حدود النصوص الدولية عمداً عند مراجعة المخطط.
اختبر فهمك
1. يحتوي عمود رسم غير سالب على CHECK (charge >= 0) فقط. هل يمكن إدخال رسم مجهول؟
اعرض الحل المشروح
نعم؛ قد يكون ناتج الفحص مجهولاً ومع ذلك يُسمح بالصف. أضف NOT NULL إذا كان الرسم إلزامياً. افصل الدقة الرقمية وحد العمل عن قرار الوجود؛ فلا القيمة الافتراضية ولا حقل العميل المطلوب يعوضان القيد المخزن.
2. قفز مفتاح هوية من 40 إلى 43 بعد عمل فاشل. هل يثبت ذلك فقدان شحنات؟
اعرض الحل المشروح
لا؛ قد يترك التوليد المعتمد على التسلسل فجوات بسبب التراجع والتخزين المؤقت والتزامن. طابق الشحنات بسجلات الأعمال والمفاتيح المثبتة لا بالتتابع الرقمي. تحتاج أرقام المستندات المنظمة قانونياً إلى بروتوكول وأثر تدقيق مستقلين، لا إعادة ضبط يدوية لمولّد هوية مشترك.
أهم ما تعلمته
- النوع الصحيح لا يثبت الوجود أو التفرّد أو السلامة المرجعية.
- يجب التصريح بسلوك أوراكل للنص الفارغ وDATE.