AzLearn

المفاتيح الأساسية والخارجية

Primary and Foreign Keys

مفهوم ~18 دقيقة

المفاتيح الأساسية والخارجية

المفتاح الأساسي يحدد الصف بشكل فريد. المفتاح الخارجي يربط جدولاً بآخر. دون هذه المفاتيح، تصبح العلاقات اتفاقاً شفهياً بين التطبيق وقاعدة البيانات. مع القيود، تصبح قاعدة البيانات شريكاً في حماية البيانات.

في SQLite يجب تفعيل foreign keys عبر PRAGMA foreign_keys = ON; في كل اتصال حتى تُفرض القيود. هذا تفصيل مهم جداً في التطبيقات.

مثال عملي

query.sql

لو حاولت إدخال طلب لعميل غير موجود، يجب أن ترفض قاعدة البيانات ذلك عند تفعيل القيود.

الفهرس التلقائي للمفتاح الأساسي

عند الإعلان عن PRIMARY KEY، تُنشئ SQLite (وسائر قواعد البيانات) فهرساً تلقائياً للعمود. لا حاجة لكتابة:

-- هذا السطر زائد تماماً — الفهرس موجود بالفعل
CREATE INDEX idx_users_id ON users(id);

يختلف الأمر مع المفاتيح الخارجية: SQLite لا تُنشئ فهرساً تلقائياً على العمود المرجعي (customer_id في orders). إذا كنت تبحث عن الطلبات بـcustomer_id كثيراً، أنشئ الفهرس يدوياً:

CREATE INDEX idx_orders_customer_id ON orders(customer_id);

PRAGMA foreign_keys و ON DELETE

SQLite لا تُفعّل قيود المفاتيح الخارجية بشكل افتراضي. يجب تشغيل هذا الأمر على كل اتصال قبل أي عملية:

PRAGMA foreign_keys = ON;  -- شغّله على كل اتصال في SQLite

في PostgreSQL و MySQL و SQL Server، القيود مفعّلة افتراضياً.

عند تعريف المفتاح الخارجي، اختر ماذا يحدث عند حذف الصف المرجعي:

الخيارالوصف
ON DELETE CASCADEاحذف الصفوف التابعة تلقائياً
ON DELETE RESTRICTارفض الحذف إذا وُجدت صفوف تابعة
ON DELETE SET NULLاجعل العمود المرجعي NULL (يتطلب أن يكون nullable)
تحدي — Challenge