logo

قيود التكامل المرجعي في نظم إدارة قواعد البيانات

يُعرف أيضًا قيد التكامل المرجعي باسم قيود المفتاح الخارجي . المفتاح الخارجي هو مفتاح تشتق قيمه من المفتاح الأساسي لجدول آخر.

يُعرف الجدول الذي تشتق منه القيم باسم رئيسي أو مرجعي يُعرف الجدول والجدول الذي يتم إدراج القيم فيه وفقًا لذلك باسم الطفل أو المرجعية الجدول، وبعبارة أخرى، يمكننا أن نقول أن الجدول الذي يحتوي على مفتاح غريب يسمى طاولة الطفل ، والجدول الذي يحتوي على المفتاح الأساسي/مفتاح المرشح يسمى الجدول المشار إليه أو الأصل . عندما نتحدث عن النموذج العلائقي لقاعدة البيانات، يمكن تعريف المفتاح المرشح على أنه مجموعة من السمات التي يمكن أن تحتوي على صفر أو أكثر من السمات.

بناء جملة الجدول الرئيسي أو الجدول المشار إليه هو:

تخطي القائمة
 CREATE TABLE Student (Roll int PRIMARY KEY, Name varchar(25) , Course varchar(10) ); 

هنا يعمل العمود Roll كـ المفتاح الأساسي، مما سيساعد في استخلاص قيمة المفتاح الخارجي في الجدول الفرعي.

قيود التكامل المرجعي

بناء جملة الجدول الفرعي أو الجدول المرجعي هو:

 CREATE TABLE Subject (Roll int references Student, SubCode int, SubName varchar(10) ); 

قيود التكامل المرجعي

في الجدول أعلاه، يعمل العمود Roll كـ مفتاح غريب، يتم اشتقاق قيمها باستخدام قيمة لفة المفتاح الأساسي من الجدول الرئيسي.

قيد المفتاح الخارجي أو قيد التكامل المرجعي.

هناك نوعان من قيود التكامل المرجعي:

إدراج القيد: لا يمكن إدراج القيمة في جدول CHILD إذا لم تكن القيمة موجودة في جدول MASTER

حذف القيد: لا يمكن حذف القيمة من MASTER Table إذا كانت القيمة موجودة في CHILD Table

الصف والعمود

لنفترض أنك تريد إدراج Roll = 05 مع قيم أخرى للأعمدة في جدول SUBJECT، فسوف ترى خطأً على الفور. تم انتهاك قيد المفتاح الخارجي 'أي عند تشغيل أمر الإدراج كـ:

أدخل في قيم SUBJECT (5، 786، OS)؛ لن يتم الترفيه عن طريق SQL بسبب قيود الإدراج (نظرًا لأنه لا يمكنك إدراج قيمة في جدول فرعي إذا لم تكن القيمة موجودة في الجدول الرئيسي، نظرًا لأن Roll = 5 غير موجود في الجدول الرئيسي، وبالتالي لن يُسمح بإدخال Roll = 5 في الجدول الفرعي)

وبالمثل، إذا كنت تريد حذف Roll = 4 من جدول الطلاب، فسوف ترى خطأً على الفور. تم انتهاك قيد المفتاح الخارجي 'أي عند تشغيل أمر الحذف على النحو التالي:

حذف من STUDENT حيث Roll = 4؛ لن يتم الترفيه عن طريق SQL بسبب قيود الحذف. (نظرًا لأنه لا يمكنك حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي، نظرًا لأن Roll = 5 موجود في الجدول الفرعي، وبالتالي لن يُسمح بحذف Roll = 5 من الجدول الرئيسي، فلنفترض إذا تمكنا بطريقة ما من حذف Roll = 5، ثم Roll = 5 سيكون متاحًا في الجدول الفرعي مما سيؤدي في النهاية إلى انتهاك قيد الإدراج.

على حذف تتالي.

وفقًا لقيود الحذف: لا يمكن حذف القيمة من MASTER Table إذا كانت القيمة موجودة في CHILD Table. يأتي السؤال التالي هل يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون انتهاك قيد الحذف؟ أي أنه في اللحظة التي نحذف فيها القيمة من الجدول الرئيسي، يجب أيضًا حذف القيمة المقابلة لها من الجدول الفرعي.

الجواب على السؤال أعلاه هو نعم، يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون مخالفة قيد الحذف، علينا إجراء تعديل بسيط أثناء إنشاء الجدول الفرعي، أي عن طريق الإضافة على حذف تتالي .

بناء جملة الجدول

 CREATE TABLE Subject (Roll int references Student on delete cascade, SubCode int, SubName varchar(10) ); 

في بناء الجملة أعلاه، مباشرة بعد الكلمة الأساسية للمراجع (المستخدمة لإنشاء مفتاح خارجي)، أضفنا سلسلة حذف، وبإضافة ذلك الآن، يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون انتهاك الحذف قيد. الآن إذا كنت تريد حذف Roll = 5 من الجدول الرئيسي على الرغم من أن Roll = 5 موجود في الجدول الفرعي، فمن الممكن لأنه في اللحظة التي تعطي فيها الأمر بحذف Roll = 5 من الجدول الرئيسي، فإن الصف الذي يحتوي على Roll = سيتم أيضًا حذف 5 من الجدول الفرعي.

قيود التكامل المرجعي
قيود التكامل المرجعي

يظهر الجدولان أعلاه STUDENT وSUBJECT اللذان يحتوي كل منهما على أربع قيم، لنفترض الآن أنك تتطلع إلى حذف Roll = 4 من جدول STUDENT(Master) عن طريق كتابة أمر SQL: احذف من STUDENT حيث Roll = 4؛

في اللحظة التي ينفذ فيها SQL الأمر أعلاه، سيتم أيضًا حذف الصف الذي يحتوي على Roll = 4 من جدول SUBJECT( Child ) ، والناتج الطالب والموضوع سيبدو الجدول كالتالي:

مساعد مفوض الشرطة
قيود التكامل المرجعي
قيود التكامل المرجعي

من الجدولين أعلاه STUDENT وSUBJECT، يمكنك أن ترى أنه في كلا الجدولين Roll = 4 يتم حذفه دفعة واحدة دون انتهاك قيود الحذف.

في بعض الأحيان يُطرح سؤال مهم جدًا في المقابلات: هل يمكن أن يحتوي المفتاح الخارجي على قيم فارغة؟

الإجابة على السؤال أعلاه هي نعم، قد يحتوي على قيم NULL، في حين أن المفتاح الأساسي لا يمكن أن يكون NULL بأي ثمن. لفهم السؤال أعلاه عمليًا، دعونا نفهم أدناه مفهوم الحذف الفارغ.

عند الحذف فارغة.

فريد من نوعه

وفقًا لقيود الحذف: لا يمكن حذف القيمة من جدول MASTER إذا كانت القيمة موجودة في جدول CHILD. يأتي السؤال التالي هل يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون انتهاك قيد الحذف؟ أي أنه في اللحظة التي نحذف فيها القيمة من الجدول الرئيسي، يجب أيضًا حذف القيمة المقابلة لها من الجدول الفرعي أو يمكن استبدالها بالقيمة NULL.

الإجابة على السؤال أعلاه هي نعم، يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون انتهاك قيود الحذف عن طريق إدراج NULL في المفتاح الخارجي، وعلينا إجراء تعديل طفيف أثناء إنشاء الجدول الفرعي، أي. بإضافة على حذف فارغة .

بناء جملة الجدول:

 CREATE TABLE Subject (Roll int references Student on delete null, SubCode int, SubName varchar(10) ); 

في بناء الجملة أعلاه، مباشرة بعد الكلمة الأساسية للمراجع (المستخدمة لإنشاء مفتاح خارجي)، أضفنا حذف فارغ، وبإضافة ذلك الآن، يمكننا حذف القيمة من الجدول الرئيسي إذا كانت القيمة موجودة في الجدول الفرعي دون انتهاك الحذف قيد. الآن إذا كنت تريد حذف Roll = 4 من الجدول الرئيسي على الرغم من أن Roll =4 موجود في الجدول الفرعي، فمن الممكن لأنه في اللحظة التي تعطي فيها الأمر بحذف Roll = 4 من الجدول الرئيسي، فإن الصف الذي يحتوي على Roll = سيتم استبدال 4 من الجدول الفرعي بقيمة NULL.

قيود التكامل المرجعي
قيود التكامل المرجعي

يظهر الجدولان أعلاه STUDENT وSUBJECT اللذان يحتوي كل منهما على أربع قيم، لنفترض الآن أنك تتطلع إلى حذف Roll = 4 من جدول STUDENT(Master) عن طريق كتابة أمر SQL: احذف من STUDENT حيث Roll = 4؛

في اللحظة التي ينفذ فيها SQL الأمر أعلاه، سيتم استبدال الصف الذي يحتوي على Roll = 4 من جدول SUBJECT(Child) بقيمة NULL، والنتيجة هي الطالب والموضوع سيبدو الجدول كالتالي:

قيود التكامل المرجعي
قيود التكامل المرجعي

من الجدولين أعلاه STUDENT وSUBJECT، يمكنك أن ترى أنه في الجدول STUDENT Roll = 4 يتم حذفه بينما يتم استبدال قيمة Roll = 4 في جدول SUBJECT بـ NULL. وهذا يثبت أن المفتاح الخارجي يمكن أن يكون له قيم فارغة. إذا كان في حالة جدول SUBJECT، فإن العمود Roll هو مفتاح أساسي إلى جانب المفتاح الخارجي، ففي هذه الحالة لا يمكننا إنشاء مفتاح خارجي يحتوي على قيم NULL.