المفاتيح الأساسية والخارجية
Primary and Foreign Keys
المفاتيح الأساسية والخارجية
المفتاح الأساسي يحدد الصف بشكل فريد. المفتاح الخارجي يربط جدولاً بآخر. دون هذه المفاتيح، تصبح العلاقات اتفاقاً شفهياً بين التطبيق وقاعدة البيانات. مع القيود، تصبح قاعدة البيانات شريكاً في حماية البيانات.
في SQLite يجب تفعيل foreign keys عبر PRAGMA foreign_keys = ON; في كل اتصال حتى تُفرض القيود. هذا تفصيل مهم جداً في التطبيقات.
مثال عملي
لو حاولت إدخال طلب لعميل غير موجود، يجب أن ترفض قاعدة البيانات ذلك عند تفعيل القيود.
الفهرس التلقائي للمفتاح الأساسي
عند الإعلان عن 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) |