در پایگاه دادههای رابطهای مانند MySQL، کلید خارجی (Foreign Key) ارتباط بین جداول را مدیریت میکند و از یکپارچگی دادهها اطمینان حاصل میکند.
اما گاهی ممکن است نیاز داشته باشیم که تنظیمات کلید خارجی را تغییر دهیم، مثلاً رفتار آن را هنگام حذف (ON DELETE) یا بهروزرسانی (ON UPDATE) تغییر دهیم. در این مقاله، نحوه ویرایش تنظیمات کلید خارجی در MySQL را بررسی میکنیم.
۱. چرا باید تنظیمات کلید خارجی را ویرایش کنیم؟
گاهی در طراحی اولیه پایگاه داده، رفتار کلید خارجی بهدرستی تنظیم نشده است. برای مثال:
- ممکن است بخواهیم حذف یک رکورد در جدول والد باعث حذف خودکار رکوردهای وابسته در جدول فرزند (ON DELETE CASCADE) شود.
- شاید بخواهیم در صورت حذف دادهها، مقدار کلید خارجی در جدول فرزند به NULL تغییر کند (ON DELETE SET NULL).
- ممکن است نیاز باشد که نوع ارتباط را از RESTRICT به CASCADE تغییر دهیم تا از خطاهای حذف جلوگیری کنیم.
۲. نحوه ویرایش تنظیمات کلید خارجی در MySQL
MySQL بهطور مستقیم اجازه ویرایش کلید خارجی را نمیدهد. برای تغییر تنظیمات آن، ابتدا باید کلید خارجی موجود را حذف کرده و سپس یک کلید خارجی جدید با تنظیمات جدید ایجاد کنیم.
۲.۱. یافتن نام کلید خارجی
قبل از حذف کلید خارجی، ابتدا باید نام کلید خارجی را پیدا کنیم. برای این کار، میتوان از دستور زیر استفاده کرد:
SHOW CREATE TABLE orders;
مثال: خروجی این دستور ممکن است شامل بخش زیر باشد:
CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE RESTRICT
در اینجا، نام کلید خارجی fk_customer است که باید حذف شود.
۲.۲. حذف کلید خارجی در MySQL
برای حذف کلید خارجی، از دستور ALTER TABLE … DROP FOREIGN KEY استفاده میکنیم:
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
✅ این دستور کلید خارجی را از جدول orders حذف میکند، اما ستون customer_id همچنان در جدول باقی میماند.
۲.۳. افزودن کلید خارجی جدید با تنظیمات دلخواه
پس از حذف کلید خارجی، میتوان یک کلید خارجی جدید با تنظیمات جدید اضافه کرد. برای مثال، اگر بخواهیم ON DELETE CASCADE را اضافه کنیم، دستور زیر را اجرا میکنیم:
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE;
✅ اکنون، در صورت حذف یک مشتری، تمام سفارشات مرتبط با او بهطور خودکار حذف خواهند شد.
۳. انواع تنظیمات کلید خارجی در MySQL
هنگام تعریف یک کلید خارجی، میتوان تنظیمات مختلفی را برای ON DELETE و ON UPDATE مشخص کرد.
گزینه | توضیح |
---|---|
ON DELETE RESTRICT | حذف رکورد والد را در صورت وجود وابستگی در جدول فرزند محدود میکند (پیشفرض MySQL). |
ON DELETE CASCADE | در صورت حذف رکورد والد، تمام رکوردهای مرتبط در جدول فرزند نیز حذف میشوند. |
ON DELETE SET NULL | در صورت حذف رکورد والد، مقدار کلید خارجی در جدول فرزند به NULL تغییر میکند. |
ON DELETE NO ACTION | مانند RESTRICT عمل میکند، اما به تأخیر میافتد تا بررسی تمام محدودیتها کامل شود. |
۴. مثالهای تغییر تنظیمات کلید خارجی
۴.۱. تغییر از RESTRICT به CASCADE
اگر کلید خارجی فعلی RESTRICT باشد و بخواهیم آن را به CASCADE تغییر دهیم، مراحل زیر را انجام میدهیم:
۱. حذف کلید خارجی موجود
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
۲. ایجاد کلید خارجی جدید با CASCADE
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE;
✅ حالا، در صورت حذف یک مشتری، تمام سفارشات وابسته به او نیز حذف خواهند شد.
۴.۲. تغییر از CASCADE به SET NULL
در این سناریو، اگر یک مشتری حذف شود، مقدار customer_id در جدول orders به NULL تنظیم خواهد شد.
۱. حذف کلید خارجی قبلی
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
۲. ایجاد کلید خارجی جدید با SET NULL
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET NULL;
✅ حالا، اگر یک مشتری حذف شود، مقدار customer_id در جدول orders NULL خواهد شد، اما رکورد سفارش همچنان باقی میماند.
۵. نکات مهم هنگام تغییر کلید خارجی در MySQL
✅ بررسی وابستگیها: قبل از حذف کلید خارجی، بررسی کنید که وابستگیهای دادهای مشکلی ایجاد نکنند.
✅ پشتیبانگیری از دادهها: قبل از تغییر کلید خارجی، از پایگاه داده Backup بگیرید تا در صورت بروز خطا، دادهها را بازیابی کنید.
✅ تنظیم مقدار NULL در جدول فرزند: اگر از ON DELETE SET NULL استفاده میکنید، ستون کلید خارجی در جدول فرزند باید مقدار NULL را بپذیرد. در غیر این صورت، تغییرات اعمال نخواهند شد.
مثال: اگر ستون customer_id مقدار NULL را نپذیرد، باید آن را تغییر دهیم:
ALTER TABLE orders MODIFY customer_id INT NULL;
۶. نتیجهگیری
در MySQL، برای تغییر تنظیمات یک کلید خارجی، باید ابتدا کلید خارجی موجود را حذف کرده و سپس یک کلید خارجی جدید با تنظیمات جدید ایجاد کنیم. این فرآیند برای تنظیم رفتار کلید خارجی هنگام حذف یا بهروزرسانی دادهها ضروری است. استفاده درست از ON DELETE CASCADE، ON DELETE SET NULL و سایر گزینهها، مدیریت پایگاه داده را بهینهتر و بدون خطای دادهای میکند.