کلید خارجی در حقیقت ممانعت میکنه از ایجاد اشکال منطقی (به عنوان مثال: ممانعت میکنه از اینکه ما بتوانیم id ای در سطح جدول person وارد کنیم که refrence آن در جدول info نباشه):
در حالتی که کلید خارجی را تعریف میکنیم تعریف نوع DATATYPE فیلد وابسته نیازی نیست:
نکته: جدول نمیتواند ۲ تا PRIMARY KEY داشته باشد و با ایجاد کلید خارجی ما در حقیقت به صورت پیشفرض به کلید اصلی آن جدول لینک میشویم اگر میخواهید به فیلد خاصی از جدول مرجع فیلد را لینک کنید نام فیلد مربوطه را در داخل پرانتز مینویسیم.
علت درج نشدن اطلاعات ردیف چهارم در جدول person همانطور که مشخصه نقض قاعده کلید خارجی است،چون id که ما میخواسم باهاش ارتباط برقرار کنیم اصلاً وجود نداره. (HOOHOO)
CREATE TABLE INFO
(ID NUMBER PRIMARY KEY,
ADDRESS VARCHAR2(20));
CREATE TABLE PERSON
(ID NUMBER PRIMARY KEY,
NAME VARCHAR2(20),
INFO_ID CONSTRAINT HOOHOO REFERENCES INFO);
INSERT INTO INFO VALUES (1, 'TEHRAN');
INSERT INTO INFO VALUES (2, 'KARAJ');
INSERT INTO PERSON VALUES
(100, 'MAHDI', 1);
INSERT INTO PERSON VALUES
(100, 'EHSAN', 1);
INSERT INTO PERSON VALUES
(100, 'FARZAD', 2);
INSERT INTO PERSON VALUES
(100, 'ALI', 3);
*
ERROR at line 1:
ORA-02291: intergraity constraint (MGHAFFARI.HOOHOO) violated - parent key
نکته: علت اصلی گذاشتن قاعده کلید خارجی در سطح دیتابیس این است که ما داده unvalid در سطح دیتابیس نداشته باشیم، البته میتوان از سطح اپلیکیشن هم این کار را انجام داده یعنی قبل از زدن Insert چک کنیم که داده وابسته تو جدول اصلی هست یا نیست، اگر نبود تذکر بدیم به عنوان مثال ما همچین کد شهری تو جدولمون نداریم.
س: اگر رکوردی از جدول اصلی حذف کنیم اون رکورد از جدول وابسته هم حذف میشه؟
ج: خیر مگر استفاده از ON DELETE CASCADE موقع تغریف کلید خارجی
برای اطلاعات بیشتر به مبحث قواعد جامعیتی مراجعه کنید
نکته: از این به بعد یاد بگیرید دیگه delete نکنید، همیشه یک فیلدی به نام status بگیرید که عدد 0,1 رو داخل خودش نگه میداره (0 یعنی delete نشده، 1 یعنی delete شده) و زمانی که select میزنید همیشه status را در where بیارید.
نکته: یادتون باشه رکورد همیشه رو سطح REDO میمونه، یعنی وقتی که رکوردی رو DELETE میکنید نه تنها REDO شما تخلیه نمیشه بلکه REDO شما سنگینتر هم میشه چون داره دستور DELETE رو هم علاوه بر دستور INSERT نگهداری میکنه. همچنین حجم DATAFILE ها چه DELETEکنید چه DELETE نکنید افزایش پیدا میکنه اما زمانی که توسط اوراکل DATAFILE رو فلاش میکنید اوراکل میاد رکوردهایی که INSERT شده را با رکوردهایی که DELETE شده مورد مقایسه قرار میده و رکوردهای متناظر را از سطح دیتابیس(DATAFILE) پاک میکنه وگرنه در زمانهای معمولی حجم DATAFILE شا سنگینتر و سنگینتر میشه
نکته: میتوان چند فیلد(ستون) را نیز باهم کلید کرد (کلید ترکیبی) که در واقع یک کلید محسوب میشود، همچنین موقع ایجاد کلید خارجی به اسم کلید اصلی ترکیبی در داخل پرانتز اشاره میکنیم.