چرا جداول در پایگاه داده با کلید خارجی باید با هم مرتبط باشند؟
1-اطمینان حاصل شود که ستون تنها حاوی مقادیر موجود در جدول دیگری است.
2-امکان جلوگیری از پاک کردن ورودی ها در جدول دیگر، و یا حذف کردن جداول ارجاع شده.
3-امکان اینکه کدام مقدار به طور پیش فرض از یک جدول نمایش داده شود.
قید کلید خارجی (Foreign Key Constraint)
همانطوری که از عنوان پیداست، کلید خارجی یک نوع قید (constraint) است که اجازه ی درج هر مقداری را در ستون (یا ستونها) مورد نظر نمی دهد. قید کلید خارجی برای پیاده سازی Referential Integrity استفاده می شود که جزئی از Data Integrity هستند.
داده های موجودیت های مختلف در جداول مختلفی ذخیره می شوند، بنابراین برای دستیابی به اطلاعات نیاز هست که بین جداول پیمایش کنیم، مدل رابطه ای (Relational Model) برای این منظور یک مکانیزمی را در اختیار گذاشته است که کلید خارجی (Foreign Key) نامیده می شود.
یک Foreign Key دارای خصیصه ها و ویژگی های زیر است:
این یک ستون (یا چند ستون) از یک جدول است که به مقدار موجود در جدول دیگر اشاره و ارجاع می کند.
جدولی که دارای کلید خارجی است، جدول فرزند (child) یا referencing گفته می شود. و به جدول دیگر جدول والد (parent) یا referenced گفته می شود.
یک کلید خارجی یک ارتباط مستقیم با کلید اصلی یا کلید کاندید (unique) جدول parent را تشکیل می دهد. بنابراین مقادیر FK محدود به مقادیر درج شده در parent-key می باشد. این قید کلید خارجی، Referential Integrity نامیده می شود. این قیود را با کمک دستورات تعریفی (Declarative) ایجاد می کنیم. که به اصطلاح به آنها Declarative Referential Integrity یا DRI به شکل خلاصه گفته می شود. (برای جامعیت داده ها بویژه Referential Integrity نرم افزار SQL Server دو مکانیزم در اختیار ما قرار داده است یکی تعریفی و دیگری رویه ای، رویه ای مثل trigger)
دیتا تایپ کلید خارجی بایستی با data type کلید parent یکسان باشد. یا اینکه data type کلید خارجی قابل تبدیل (convertible) به نوع داده parent-key باشد.
برخلاف Primary Key ها که نمی توانند Nullable باشند، کلیدهای خارجی می توانند Null بپذیرند. البته بدیهی است که باید ستون کلید خارجی Allow Null باشد.
کلیدخارجی ممکن است Primary Key نیز باشد. بطور مثال در یک ارتباط یک به یک، در یکی از جداول کلید اصلی، کلید خارجی نیز هست.
در بعضی از سناریو ها ممکن است که parent-key یک foreign key در همان جدول باشد. یعنی کلید خارجی به کلید اصلی همان جدول ارجاع می کند. که به اصطلاح به آن self-referncing گفته میشود. یک طراحی معروفی که می توانیم مثال بزنیم، جدول کارمندان است.
هدف از ایجاد کلید خارجی جلوگیری از درج رکورد های یتیم (Orphan) است. یعنی اگر قیدی وجود نداشته باشد می توانیم در جدول Child مقادیری را درج کنیم که در جدول Parent هنوز درج نشده اند. مثلا برای فردی انتخاب واحد کنیم که جزء دانشجویان نبوده است. این موضوع باعث زیر سوال رفتن جامعیت داده ها شده و در تمام موارد مشکل ساز خواهد بود.
به دو تصویر زیر دقت کنید. در تصاویر زیر parent table و child table و primary key و foreign key کاملا مشخص است.