کلید خارجی (Foreign Key) یکی از مهمترین مفاهیم در طراحی پایگاه دادههای رابطهای مانند MySQL است.
این ویژگی به ما کمک میکند تا ارتباط بین جداول را تعریف کنیم و از یکپارچگی دادهها اطمینان حاصل کنیم. در این مقاله، مفهوم کلید خارجی، کاربردهای آن و نحوه پیادهسازی آن در MySQL را بررسی خواهیم کرد.
۱. کلید خارجی چیست؟
کلید خارجی یک فیلد (یا مجموعهای از فیلدها) در یک جدول فرزند است که به کلید اصلی (Primary Key) در یک جدول والد اشاره میکند. این ویژگی تضمین میکند که مقدارهای موجود در فیلد کلید خارجی حتماً در جدول والد وجود داشته باشند، و از ورود دادههای نامعتبر جلوگیری میکند.
مثال ساده:
فرض کنید دو جدول داریم:
- customers (مشتریان) که اطلاعات مشتریان را ذخیره میکند.
- orders (سفارشات) که سفارشات مشتریان را نگه میدارد.
در این سناریو، ستون customer_id در جدول orders به customer_id در جدول customers به عنوان کلید خارجی اشاره میکند.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
در اینجا، customer_id در جدول orders یک کلید خارجی است که به ستون customer_id در جدول customers اشاره دارد.
۲. کاربردهای کلید خارجی در MySQL
۲.۱. ایجاد ارتباط بین جداول
با استفاده از کلید خارجی، میتوان جداول را به هم مرتبط کرد. این امر در پایگاه دادههای نرمالشده بسیار مهم است، زیرا اطلاعات مرتبط به جای تکرار شدن در چندین جدول، در جداول جداگانه نگهداری میشوند.
۲.۲. حفظ یکپارچگی دادهها (Referential Integrity)
یکی از مزایای اصلی کلید خارجی این است که از وارد شدن دادههای نامعتبر جلوگیری میکند. به عبارت دیگر، مقدار کلید خارجی در جدول فرزند باید حتماً در جدول والد وجود داشته باشد.
مثال:
در جدول orders نمیتوان سفارشی را ثبت کرد که به مشتریای اشاره داشته باشد که در جدول customers وجود ندارد.
۲.۳. جلوگیری از حذف ناخواسته دادهها
اگر یک رکورد در جدول والد حذف شود، ممکن است دادههای وابسته در جدول فرزند نامعتبر شوند. کلید خارجی این مشکل را مدیریت میکند و میتوان رفتارهای مختلفی را برای کنترل حذف و تغییر دادهها تنظیم کرد.
۳. انواع رفتارهای کلید خارجی در MySQL
هنگام ایجاد کلید خارجی، میتوان مشخص کرد که هنگام حذف یا بهروزرسانی دادهها در جدول والد، چه اتفاقی برای دادههای وابسته در جدول فرزند بیفتد.
۳.۱. RESTRICT (محدود کردن)
عمل پیشفرض: اجازه حذف یا تغییر مقدار کلید اصلی را نمیدهد، اگر دادههای وابسته در جدول فرزند وجود داشته باشند.
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE RESTRICT
مثال: اگر مشتریای در جدول customers وجود داشته باشد که سفارشاتی در جدول orders دارد، حذف این مشتری مجاز نخواهد بود.
۳.۲. CASCADE (حذف یا تغییر زنجیرهای)
با این گزینه، اگر یک مقدار در جدول والد حذف یا بهروزرسانی شود، تغییرات به صورت اتوماتیک در جدول فرزند اعمال میشود.
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
مثال: اگر یک مشتری حذف شود، تمام سفارشات مرتبط با او نیز حذف خواهند شد.
۳.۳. SET NULL (تنظیم مقدار NULL)
در این حالت، اگر مقدار کلید اصلی در جدول والد حذف شود، مقدار کلید خارجی در جدول فرزند NULL میشود.
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET NULL
مثال: اگر یک مشتری حذف شود، مقدار customer_id در جدول orders برابر با NULL خواهد شد.
۳.۴. NO ACTION (بدون تغییر)
این گزینه مانند RESTRICT است و اجازه حذف یا تغییر مقدار کلید اصلی را نمیدهد، مگر اینکه تغییر ابتدا در جدول فرزند اعمال شود.
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE NO ACTION
۴. نحوه تعریف کلید خارجی در MySQL
۴.۱. هنگام ایجاد جدول
میتوان کلید خارجی را هنگام ایجاد جدول با استفاده از دستور FOREIGN KEY تعریف کرد:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);
۴.۲. افزودن کلید خارجی بعد از ایجاد جدول
اگر جدول قبلاً ایجاد شده باشد، میتوان با استفاده از دستور ALTER TABLE یک کلید خارجی اضافه کرد:
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE;
۴.۳. حذف کلید خارجی
برای حذف یک کلید خارجی، میتوان از دستور DROP FOREIGN KEY استفاده کرد:
ALTER TABLE orders
DROP FOREIGN KEY fk_customer;
۵. مزایای استفاده از کلید خارجی در MySQL
مزیت | توضیح |
---|---|
حفظ یکپارچگی دادهها | مانع از ورود دادههای نامعتبر میشود. |
کاهش افزونگی دادهها | اطلاعات مشترک در جداول جداگانه ذخیره میشوند. |
افزایش کارایی جستجو و بازیابی دادهها | بازیابی دادههای مرتبط از چند جدول بهینهتر میشود. |
مدیریت بهتر حذف و بهروزرسانی دادهها | میتوان حذف زنجیرهای یا تنظیم مقدار NULL را پیکربندی کرد. |
۶. نتیجهگیری
کلید خارجی در MySQL یکی از مهمترین ویژگیها برای ایجاد ارتباط بین جداول و مدیریت بهتر دادهها است. این ویژگی نهتنها از ورود دادههای نامعتبر جلوگیری میکند، بلکه عملیات حذف و بهروزرسانی دادهها را مدیریت کرده و عملکرد پایگاه داده را بهبود میبخشد. هنگام طراحی پایگاه داده، استفاده صحیح از کلیدهای خارجی به ایجاد یک ساختار پایدار و قابل مدیریت کمک میکند.