PostgreSQL / الأساسي: الأسس العلاقية / الدرس 2
الأنواع والقيود والهوية المولدة
صف حقائق الطرود بأنواع دقيقة وعلاقات صحيحة وقواعد واضحة للقيم المفقودة. ميز توليد الهوية عن التفرد وعرض المنطقة الزمنية.
في هذه الصفحة
أهداف الدرس
- اختيار الأنواع العددية والنصية والزمنية وفق المعنى.
- شرح عقود الهوية وCHECK وNOT NULL والمفتاح الخارجي.
اختر المعنى قبل سهولة التخزين
استخدم numeric(9,2) لرسم دقيق بسبعة أرقام صحيحة واثنين كسريين بدلاً من التقريب العائم. يناسب النص رمزاً بريدياً بأصفار أولى مهمة. لا تعني text وvarchar فرق أداء عاماً؛ اختر قيد طول عند الحاجة التجارية. يخزن boolean قيمة منطقية لا اتفاق tiny integer خاصاً بمنتج آخر. تساعد الأنواع الصريحة على رفض التعابير غير المتوافقة.
عبر عن قيود مستقلة
يفترض التعريف مخطط quay_lab معزولاً. توفر GENERATED ALWAYS AS IDENTITY القيم ولا تجعل العمود فريداً وحدها، لذلك نصرح بالمفتاح الأساسي. يقيد CHECK الرسوم المعلومة وتمنع NOT NULL الغائبة؛ يقبل CHECK النتيجة المجهولة وحده. يسجل delivered_at القابل للفراغ غياب لحظة التسليم. تعامل PostgreSQL معظم تعريف البيانات العادي معاملاتياً خلاف الحفظ الضمني المعتاد في MySQL، مع عمليات مستثناة لاحقاً.
CREATE TABLE quay_lab.parcels (
parcel_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tracking_code text NOT NULL UNIQUE,
fee numeric(9,2) NOT NULL CHECK (fee >= 0),
delivered_at timestamptz
);
تتوفر صياغة الهوية منذ PostgreSQL 10 ولا تعد بأرقام بلا فجوات.
تختلف اللحظة عن قراءة الساعة المحلية
يمثل timestamptz لحظة ويعرضها بمنطقة الجلسة ولا يحفظ اسم المنطقة الأصلي. يمثل timestamp without time zone قراءة محلية دون معنى التحويل ذاته. احفظ منطقة المصدر منفصلة عندما تكون معلومة تجارية. تعني NULL مجهولاً أو غائباً لا صفراً أو نصاً فارغاً. المساواة معها مجهولة، فاستخدم IS NULL أو مقارنة آمنة للفراغ حسب السؤال.
استدل على القيم دون عينة خادم
يعيد الاستعلام الرسم الدقيق 12.30 وtrue لغياب التسليم وtrue لتساوي لحظتين بإزاحتين مختلفتين. تقارن الإزاحات القيم لا سلاسل العرض، فلا تعتمد النتيجة المنطقية على منطقة العرض. توضح أسماء الأعمدة العقد. ينبغي للتطبيق ربط القيم المعلمة عبر الموصل بدلاً من لصق النص، ويكون التحقق عند الإدخال وحدود قيود القاعدة.
SELECT 12.30::numeric(9,2) AS fee,
NULL::timestamptz IS NULL AS missing_delivery,
timestamptz '2026-10-01 10:00:00+00' =
timestamptz '2026-10-01 12:00:00+02' AS same_instant;
fee | missing_delivery | same_instant
12.30 | true | true
القيم المنطقية true، ويعرضها psql غالباً t؛ قد يختلف تنسيق العميل.
تحتاج المفاتيح والترتيب مراجعتين منفصلتين
يحتاج المفتاح الخارجي مفتاحاً مرجعياً فريداً وأنواعاً متوافقة. لا تنشئ PostgreSQL تلقائياً فهرس أعمدة الفرع، فادرسه للربط وفحص تغيير الأصل. تسمح القيود الفريدة عادة بعدة NULL، وتتوفر NULLS NOT DISTINCT منذ 15 لاعتبارها متساوية. تعتمد مقارنة النص على الترتيب ومزوده؛ لا تنقل أسماء MySQL ولا تفترض إعادة كتابة التعريفات بتغيير افتراض القاعدة. اختر سلوك حذف الأصل مثل RESTRICT أو CASCADE بحسب عواقب العمل. يجوز غياب مرجع فرعي قابل للفراغ؛ أضف NOT NULL إذا كانت العلاقة إلزامية.
الأخطاء الشائعة وإصلاحها
null value violates not-null constraint (23502)
- لماذا يحدث؟
- أُهملت حقيقة لازمة أو أُرسلت NULL.
- كيف تصلحه؟
- وفر قيمة صحيحة أو راجع جواز الغياب.
- كيف تتجنب تكراره؟
- نمذج قواعد الغياب منفصلة عن CHECK.
duplicate key value violates unique constraint (23505)
- لماذا يحدث؟
- تتعارض الهوية أو شفرة التتبع مع بيانات موجودة.
- كيف تصلحه؟
- حدد القيد وميز إعادة المحاولة عن سجل متعارض.
- كيف تتجنب تكراره؟
- حدد عدم تكرار الأثر وتوحيد الشفرات قبل الاستيراد.
البحث بالمفتاح الخارجي مكلف خلاف المتوقع
- لماذا يحدث؟
- لا تملك أعمدة الفرع فهرساً مناسباً.
- كيف تصلحه؟
- افحص الحمل واقترح فهرساً مناسباً للفرع.
- كيف تتجنب تكراره؟
- راجع فهارس الفروع ولا تفترض إنشاءها تلقائياً.
اختبر فهمك
1. هل يمنع CHECK (fee >= 0) وحده NULL؟ وضح أصغر عقد رسم كامل.
اعرض الحل المشروح
لا؛ ينجح CHECK عند true أو unknown فتجتاز NULL. استخدم NOT NULL للوجود وCHECK للمجال المعلوم مع نوع عددي دقيق وحد موثق. تجيب القيود عن أسئلة مختلفة وتبقى لازمة مع تحقق الواجهة.
2. لماذا تظهر فجوات الهوية بعد إدراج متراجع، وهل تصلح تسلسلاً قانونياً بلا فجوات للإيصالات؟
اعرض الحل المشروح
لا يتراجع تخصيص التسلسل مع المعاملة وتؤثر عليه المزامنة. تسهل الهوية المعرفات ولا توفر ترقيم عمل بلا فجوات. أبقِ المفتاح البديل وصمم بروتوكول الإيصال وفق المعاملة والتدقيق والمتطلبات المختصة، ولا تصلح الفجوات بإعادة ضبط تسلسل حي.
أهم ما تعلمته
- الوجود وصحة المجال والتفرد والتوليد ضمانات منفصلة.
- اعتمد سلوك أنواع PostgreSQL وقيودها صراحة.