در SQL، کلیدهای خارجی (Foreign Keys) یکی از مفاهیم مهم در طراحی پایگاهدادهها هستند که برای تعریف و حفظ روابط بین جداول مختلف استفاده میشوند. این کلیدها به ایجاد یک ارتباط منطقی بین دادههای یک جدول و دادههای جدول دیگر کمک میکنند.
1. کلید خارجی چیست؟
یک کلید خارجی (Foreign Key) یک ستون یا مجموعهای از ستونها است که مقادیر آن به مقادیر کلید اصلی (Primary Key) یا ستون منحصربهفرد در جدول دیگر اشاره میکند. هدف از استفاده از کلید خارجی، حفظ یکپارچگی دادهها و ایجاد ارتباط بین جداول مختلف است.
2. ارتباط بین جداول با استفاده از کلید خارجی:
زمانی که دو جدول در پایگاهداده به هم مرتبط هستند، معمولاً یکی از جداول کلید اصلی (Primary Key) دارد و جدول دیگر از آن کلید به عنوان کلید خارجی استفاده میکند. این ارتباطها میتوانند به صورتهای مختلف باشند:
- یک به یک (One-to-One)
- یک به چند (One-to-Many)
- چند به چند (Many-to-Many)
الف. ارتباط یک به چند (One-to-Many):
یکی از رایجترین نوع ارتباطها در پایگاه دادههاست. در این نوع ارتباط، یک رکورد از یک جدول میتواند به چند رکورد در جدول دیگر مرتبط باشد.
مثال:
- فرض کنید دو جدول داریم:
کاربران
وپستها
. هر کاربر میتواند چندین پست داشته باشد، اما هر پست متعلق به یک کاربر خاص است.
در جدول پستها
، یک ستون به نام کاربر_شناسه
داریم که به ستون شناسه
جدول کاربران
اشاره میکند.
شناسه INT PRIMARY KEY,
نام VARCHAR(100)
);
CREATE TABLE پستها (
شناسه INT PRIMARY KEY,
عنوان VARCHAR(200),
متن TEXT,
کاربر_شناسه INT,
FOREIGN KEY (کاربر_شناسه) REFERENCES کاربران(شناسه)
);
در اینجا:
- ستون
کاربر_شناسه
در جدولپستها
کلید خارجی است که به ستونشناسه
در جدولکاربران
اشاره میکند. - هر کاربر میتواند چندین پست داشته باشد، اما هر پست فقط به یک کاربر تعلق دارد.
ب. ارتباط یک به یک (One-to-One):
در این نوع ارتباط، هر رکورد از جدول اول با یک رکورد منحصر به فرد از جدول دوم مرتبط است.
مثال:
- فرض کنید دو جدول داریم:
کاربران
واطلاعات_حساب
. هر کاربر فقط یک رکورد در جدولاطلاعات_حساب
دارد و بالعکس.
شناسه INT PRIMARY KEY,
نام VARCHAR(100)
);
CREATE TABLE اطلاعات_حساب (
شناسه INT PRIMARY KEY,
شماره_کارت_بانکی VARCHAR(20),
کاربر_شناسه INT,
FOREIGN KEY (کاربر_شناسه) REFERENCES کاربران(شناسه)
);
در اینجا:
- هر کاربر فقط یک رکورد در جدول
اطلاعات_حساب
دارد، بنابراین ارتباط یک به یک است.
ج. ارتباط چند به چند (Many-to-Many):
در این نوع ارتباط، یک رکورد از جدول اول میتواند با چندین رکورد از جدول دوم مرتبط باشد و بالعکس. برای ایجاد این نوع ارتباط، معمولاً از یک جدول میانه (جدول کمکی) استفاده میشود.
مثال:
- فرض کنید دو جدول داریم:
دانشآموزان
ودروس
. هر دانشآموز میتواند چندین درس را بردارد و هر درس نیز میتواند به چندین دانشآموز اختصاص داده شود.
برای مدلسازی این ارتباط از یک جدول میانه به نام دانشآموز_دروس
استفاده میکنیم:
شناسه INT PRIMARY KEY,
نام VARCHAR(100)
);
CREATE TABLE دروس (
شناسه INT PRIMARY KEY,
نام درس VARCHAR(100)
);
CREATE TABLE دانشآموز_دروس (
دانشآموز_شناسه INT,
درس_شناسه INT,
PRIMARY KEY (دانشآموز_شناسه, درس_شناسه),
FOREIGN KEY (دانشآموز_شناسه) REFERENCES دانشآموزان(شناسه),
FOREIGN KEY (درس_شناسه) REFERENCES دروس(شناسه)
);
در اینجا:
- جدول
دانشآموز_دروس
به عنوان یک جدول کمکی عمل میکند که ارتباط بیندانشآموزان
ودروس
را برقرار میکند. - این جدول دو کلید خارجی دارد: یکی به
دانشآموزان
و دیگری بهدروس
.
3. مزایای استفاده از کلید خارجی:
- حفظ یکپارچگی ارجاعی: کلیدهای خارجی به اطمینان از این که دادهها به درستی و به طور منطقی به هم مرتبط هستند کمک میکنند. مثلاً نمیتوان رکوردی در جدول پستها ایجاد کرد که به شناسه کاربری غیرموجود اشاره کند.
- ممانعت از دادههای اشتباه: کلیدهای خارجی از وارد کردن دادههایی که به رکوردهای غیرموجود ارجاع میدهند جلوگیری میکنند.
- پشتیبانی از حذف و بروزرسانی خودکار: با استفاده از گزینههای
ON DELETE
وON UPDATE
میتوان رفتار حذف یا بروزرسانی رکوردهای مرتبط را مشخص کرد.
4. گزینههای کلید خارجی (ON DELETE و ON UPDATE):
هنگامی که یک کلید خارجی تعریف میشود، میتوان مشخص کرد که اگر رکورد اصلی (در جدول والد) حذف یا بروزرسانی شد، چه عملی باید انجام شود. برخی از گزینهها عبارتند از:
- CASCADE: اگر رکورد والد حذف یا بروزرسانی شد، رکوردهای فرزند نیز حذف یا بروزرسانی میشوند.
- SET NULL: اگر رکورد والد حذف یا بروزرسانی شد، مقادیر کلید خارجی در جدول فرزند به
NULL
تغییر میکنند. - RESTRICT: از حذف یا بروزرسانی رکورد والد جلوگیری میشود تا زمانی که رکوردهای فرزند وجود داشته باشند.
- NO ACTION: مشابه
RESTRICT
، اما بیشتر در پایگاهدادههایی با ویژگیهای خاص استفاده میشود.
مثال:
شناسه INT PRIMARY KEY,
عنوان VARCHAR(200),
کاربر_شناسه INT,
FOREIGN KEY (کاربر_شناسه) REFERENCES کاربران(شناسه)
ON DELETE CASCADE
);
در این مثال، اگر رکوردی در جدول کاربران
حذف شود، تمام پستهای مربوط به آن کاربر نیز به طور خودکار حذف خواهند شد.
نتیجهگیری:
استفاده از کلیدهای خارجی در SQL به شما این امکان را میدهد که روابط بین جداول مختلف را به راحتی تعریف کرده و یکپارچگی دادهها را حفظ کنید. این ابزار برای طراحی پایگاهدادههای پیچیده و با دادههای مرتبط ضروری است.
